我有一个数据集df:
df=data.frame(rbind(c("A",1,1,"abc"),
c("B",0,0,"def"),
c("C",0,1,"hep"),
c("A",1,1,"hit"),
c("B",0,1,"occ"),
c("C",1,1,"tem"),
c("A",1,1,"twi"),
c("B",1,1,"twa"),
c("C",1,1,"mit"),
c("A",1,1,"mot"),
c("C",1,1,"mot"),
c("B",1,1,"mjak")))
names(df)=c("id","v1","v2","check")
我想在DF中创建ID的子集,其中包含“检查”列的“ ch.vars”向量中包含的值。
ch.vars=c("abc","hit","mot","twi","mjak")
如果id包含“ ch.vars”中给出的值以外的其他任何值,则将从数据集中排除它们。例如,id B和C在检查列中包含其他值,因此将它们排除在子集中。
到目前为止,这是我尝试过的:
df$check.var=ifelse(df$check %in% ch.vars,1,0)
df=arrange(df,id)
st1=filter(df,check.var==0)
st1=as.character(unique(st1$id))
df2=df[!df$id %in% st1,]
> df2
id v1 v2 check check.var
1 A 1 1 abc 1
2 A 1 1 hit 1
3 A 1 1 twi 1
4 A 1 1 mot 1
这行得通,但我想知道是否有更有效的方法来做到这一点,即以更少的步骤实现结果。谢谢!
您可以通过group_by
和filter
在dplyr软件包中执行此操作:
library(dplyr)
df2 = df %>%
group_by(id) %>%
filter(all(check %in% ch.vars))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句