2016-07-21 31 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)),]