2015-10-13 107 views
1

我想从另一个数据帧中存在的数据帧中删除数据。让我举一个例子:从另一个数据帧中存在的一个数据帧中删除数据R

letters<-c('a','b','c','d','e') 
numbers<-c(1,2,3,4,5) 
list_one<-data.frame(letters,numbers) 

我想在信件删除list_one每一行与匹配该数据帧等:

letters2<-c('a','c','d') 
list_two<-data.frame(letters2) 

我要指出,我其实是想用做此两个大的csv文件,所以我真的不能使用负面表达 - 取出行。

然后创建一个只包含字母b和e及其相应数字的最终数据框。我该怎么做呢?

我是R的新手,所以当我不确定要搜索什么关键术语时,很难研究问题。任何帮助表示赞赏,谢谢!

+0

据透露,'letters'实际上是一个常数/内置载体,如' LETTERS' – Frank

回答

1

基地R染料溶液

list_one[!list_one$letters %in% list_two$letters2,] 

给你:

letters numbers 
2  b  2 
5  e  5 

Explainaition:

> list_one$letters %in% list_two$letters2 
[1] TRUE FALSE TRUE TRUE FALSE 

给你的LENGTH == length(list_one$letters)用TRUE/FALSE的值的矢量。 !否定此向量。因此,如果值存在于list_two $ letters2中,则结果为FALSE/TRUE值。

如果您有关于如何选择从data.frame行进入

?`[.data.frame` 

控制台和阅读的问题。

1

回答是您的编辑回复: “所以我真的不能使用否定表达”。

我想最有效的方法可以做到这一个是使用data.table如下:

require(data.table) 
setDT(list_one) 
setDT(list_two) 
list_one[!list_two, on=c(letters = "letters2")] 

或者

require(data.table) 
setDT(list_one, key = "letters") 
setDT(list_two, key = "letters2") 
list_one[!letters2] 

(感谢Frank的改进)

结果:

letters numbers 
1:  b  2 
2:  e  5 

查看?"data.table"Quickly reading very large tables as dataframes in R,了解为什么要使用data.table::fread来首先读取csv文件。

顺便说一句:如果你有letters2,而不是list_two可以使用

list_one[!J(letters2)] 
2

一个dplyr解决

library(dplyr) 

list_one %>% anti_join(list_two)