从数据框中删除行

时间:2016-11-16 06:16:20

标签: r dataframe apply

我有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$id1df$id2不在vec

的任何行

有没有更快的方法来找到满足这个条件的行索引:

rm.idx <- which(!apply(df,1,function(x) all(x %in% vec)))

3 个答案:

答案 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)))

也很快。