我有一个示例数据框,在下面给出的第一列中包含重复的条目:
df <- data.frame(ID=c(rep(101,3),rep(102,2),103,rep(104,3)),Type=c(2,1,1,1,2,1,3,1,2),sex=c(0,0,0,1,1,1,0,0,0))
df
ID Type sex
1 101 2 0
2 101 1 0
3 101 1 0
4 102 1 1
5 102 2 1
6 103 1 1
7 104 3 0
8 104 1 0
9 104 2 0
问题:对于每个变量“ID”,我希望行从变量“Type”第一次出现为 1(即 Type=1)的位置开始。
我知道对于每个 ID,使用以下代码满足条件 Type=1 的位置:
aggregate(df$Type,list(ID=df$ID),function(x) match(1,x))
ID x
1 101 2
2 102 1
3 103 1
4 104 2
但是我还没能解决这个问题。
所需输出:输出应如下所示:
df.result <- data.frame(ID=c(101,101,102,102,103,104,104),Type=c(1,1,1,2,1,1,2),sex=c(0,0,1,1,1,0,0))
df.result
ID Type sex
1 101 1 0
2 101 1 0
3 102 1 1
4 102 2 1
5 103 1 1
6 104 1 0
7 104 2 0
谢谢!
最佳答案
我们可以将match
与slice
结合使用
library(dplyr)
df %>% group_by(ID) %>% slice(match(1, Type) : n())
# ID Type sex
# <dbl> <dbl> <dbl>
#1 101 1 0
#2 101 1 0
#3 102 1 1
#4 102 2 1
#5 103 1 1
#6 104 1 0
#7 104 2 0
或者使用过滤器
df %>% group_by(ID) %>% filter(row_number() >= match(1, Type))
在基础 R 中,我们可以使用 ave
,例如:
subset(df, as.logical(ave(Type, ID, FUN = function(x) seq_along(x) >= match(1, x))))
关于r - 提取一列中具有满足另一列中给定条件的重复条目的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60258721/