2016-07-21 28 views
1

我有一個數據集清單這樣的,或者也可以稱爲列表中移除如何從清單R中刪除多個值?

ID Place 
1  A 
2  B  
3  C 
4  D  
5  E 
6  E 

這裏是數據框1

ID Place 
1  A 
1  B 
1  C 
1  D 
1  H 
1  J 
2  A 
2  B 
2  F 
2  J 
2  D 
3  A 
3  E 
3  C 
3  T 
4  D 
4  E 
5  A 
5  E 
5  U 
6  A 
6  B 
6  C 
6  E 
6  F 

我想用「ID的地方」組合從清單來在數據幀1中取出一些行,結果應該是這樣的

ID Place 
1 B 
1 C 
1 D 
1 H 
1 J 
2 A 
2 F 
2 J 
2 D 
3 A 
3 E 
3 T 
4 E 
5 A 
5 U 
6 A 
6 B 
6 C 
6 F 

回答

2

雖然你可以做到這一點,在幾個步驟,merge,可以綁定remove設置爲原始數據集,然後刪除已添加的行和任何duplicated案件:

df1[tail(!duplicated(rbind(remove,df1)), -nrow(remove)),] 
# ID Place 
#2 1  B 
#3 1  C 
#4 1  D 
#5 1  H 
#6 1  J 
#7 2  A 
#9 2  F 
#10 2  J 
#11 2  D 
#12 3  A 
#13 3  E 
#15 3  T 
#17 4  E 
#18 5  A 
#20 5  U 
#21 6  A 
#22 6  B 
#23 6  C 
#25 6  F 

下面是兩個步驟合併代碼:

out <- merge(df1, transform(remove, drop=1), all=TRUE) 
out[ is.na(out$drop), -match("drop", names(out)) ] 
2

這裏有一個選項:

dplyr::setdiff(df2, df1) 

數據:

df1 <- read.table(header=T, stringsAsFactors = F, text="ID Place 
1  A 
2  B  
3  C 
4  D  
5  E 
6  E") 
df2 <- read.table(header=T, stringsAsFactors = F, text="ID Place 
1  A 
1  B 
1  C 
1  D 
1  H 
1  J 
2  A 
2  B 
2  F 
2  J 
2  D 
3  A 
3  E 
3  C 
3  T 
4  D 
4  E 
5  A 
5  E 
5  U 
6  A 
6  B 
6  C 
6  E 
6  F") 
0

另一個base R選項在每個數據集粘貼排在一起,得到一個合理的指標與%in%和否定!它子集原始數據集(「DF1」)的行

df1[!do.call(paste, df1) %in% do.call(paste, rmdat),] 
# ID Place 
#2 1  B 
#3 1  C 
#4 1  D 
#5 1  H 
#6 1  J 
#7 2  A 
#9 2  F 
#10 2  J 
#11 2  D 
#12 3  A 
#13 3  E 
#15 3  T 
#17 4  E 
#18 5  A 
#20 5  U 
#21 6  A 
#22 6  B 
#23 6  C 
#25 6  F 

或者這可以用Reduce/Map/%in%/&組合來完成。

df1[Reduce(`&`, Map(`%in%`, df1, rmdat)),]