2015-10-13 119 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) 
相關問題