2016-11-16 139 views
0

我有此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

有沒有更快的方式找到符合這個條件的行索引而不是t他的:

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

如果只有這兩種元素來檢查,'這(!(DF $ ID1%的%VEC和DF在%VEC $ ID2%))' –

回答

1

在列上循環可能比在行上循環更快。因此,使用lapply遍歷列,創建邏輯vector S的%in%一個list,使用Reduce|檢查是否有真值對應於每個行並用它來子集「DF」

df[Reduce(`|`, lapply(df, `%in%`, vec)),] 

如果我們需要兩個元素,然後用&

​​
1

其實

更換

也快。

+0

你不需要用「獨特」來包裝它; '哪個'會給你一個滿足條件的行號索引(這是唯一的設計) – Jaap

2

我以前dplyr這樣的腳本

df1 <- df %>% filter(!(df$id1 %in% vec)|!(df$id2 %in% vec))