18

我有以下两种数据帧(例如):删除另一个数据框中存在的行吗?

DF1:

name profile type strand 
A  4.5  1  + 
B  3.2  1  + 
C  5.5  1  + 
D  14.0  1  - 
E  45.1  1  - 
F  32.8  1  - 
G  19.9  1  + 

DF2:

name 
A 
B 
C 
G 

我想删除df1的行,这df1$name = df2$name得到如下:

输出:

name profile type strand 
D  14.0  1  - 
E  45.1  1  - 
F  32.8  1  - 

如果有人能告诉我使用哪一段代码会有很多帮助,起初看起来很简单,但自从昨天以来我一直在搞乱它。

+1

推荐阅读R上的一些应用手册,很好的起点http://stackoverflow.com/tags/r/info – zx8754

+0

感谢您的有用链接! – biohazard

回答

24

您需要%in%运算符。所以,

df1[!(df1$name %in% df2$name),] 

应该给你你想要的。在df1$name

  • df1$name %in% df2$name测试是否在df2$name
  • !操作者反转的结果。
+0

非常感谢!你有什么想法我应该做什么来使它对称?我注意到''df1 [!(df1 $ name%in%df2 $ name),]'和'df2 [!(df2 $ name%in%df1 $ name),'''给我不同的结果... – biohazard

+0

如果列名不是唯一的? – Cina

+1

在数据框中,列必须是唯一的。 – csgillespie

0

DF1 [!(as.character(DF1 $的jobId)在%as.character(DF2 $的jobId)%)]

我不得不as.charaacter添加到我的执行,因为作业ID不一个字符,而不是一个因素,并不是%的%应该是这个直接

12

这有时被称为反连接转换:

library(dplyr) 
anti_join(df1, df2, by = "name") 
相关问题