我有data.frame
:
set.seed(1)
df <- data.frame(id1=LETTERS[sample(26,100,replace = T)],id2=LETTERS[sample(26,100,replace = T)],stringsAsFactors = F)
和vector
:
vec <- LETTERS[sample(26,10,replace = F)]
我想从df
移除df$id1
或df$id2
不在vec
有没有更快的方法来找到满足这个条件的行索引:
rm.idx <- which(!apply(df,1,function(x) all(x %in% vec)))
答案 0 :(得分:2)
我使用dplyr
这样的脚本
df1 <- df %>% filter(!(df$id1 %in% vec)|!(df$id2 %in% vec))
答案 1 :(得分:1)
循环列可能比行更快。因此,使用lapply
循环列,使用list
创建vector
逻辑%in%
,使用Reduce
和|
进行检查是否每个相应行都有任何TRUE值,并使用它来对&f; df&#39;
df[Reduce(`|`, lapply(df, `%in%`, vec)),]
如果我们需要这两个元素,请将|
替换为&
df[Reduce(`&`, lapply(df, `%in%`, vec)),]
答案 2 :(得分:1)
实际上
rm.idx <- unique(which(!(df$id1 %in% vec) | !(df$id2 %in% vec)))
也很快。