我有一个数据帧,如下所示-
df <- cbind(c(1,1,1,2,2,2,3,3,3,3), c(6,12,18,3,9,12,4,8,12,16),c(3,3,3,2,2,2,4,4,4,4))
colnames(df) <- c("ID","value","index")
我想得到以下结果-
df1 <- cbind(c(1,2,3), c(18,9,16),c(3,2,4))
因此,我基本上想提取(对于每个ID(行号等于该ID索引的行。例如,ID 1的第3行、ID 2的第2行和ID 4的第4行。
我尝试了以下代码
df1 <- df%>%group_by(ID)%>%filter(index==index)
但它不起作用。请帮我解决这个问题。
使用slice
为每个ID
选择index
行。
library(dplyr)
df %>% group_by(ID) %>% slice(first(index)) %>% ungroup
# ID value index
# <dbl> <dbl> <dbl>
#1 1 18 3
#2 2 9 2
#3 3 16 4
这可以在data.table
和基本R中写成:
library(data.table)
setDT(df)[, .SD[first(index)], ID]
#Base R
subset(df, index == ave(value, ID, FUN = seq_along))
数据
df <- data.frame(ID = c(1,1,1,2,2,2,3,3,3,3),
value = c(6,12,18,3,9,12,4,8,12,16),
index = c(3,3,3,2,2,2,4,4,4,4))
添加到Ronak Shah的答案中,我想做你想做的事情的简单代码之一是:
library(dplyr)
df <-
data.frame(ID = c(1,1,1,2,2,2,3,3,3,3), value = c(6,12,18,3,9,12,4,8,12,16), index = c(3,3,3,2,2,2,4,4,4,4))
df %>% group_by(ID) %>% filter(row_number() == index) %>% ungroup