如何从清单R中删除多个值的行?

时间:2016-07-21 23:31:14

标签: 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 Place'组合删除数据框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

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:2)

虽然您可以通过几个步骤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)) ]

以下是两步合并代码:

{{1}}

答案 2 :(得分:0)

另一个base R选项将每个数据集中的行粘贴在一起,并使用%in%获取逻辑索引,并取消!它以对原始数据集的行进行子集化(&#39; DF1&#39)

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)),]