我有这样的数据集核对表,或者可以将其称为删除列表
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
答案 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)),]