2016-11-21 26 views
0

我需要創建一個新數據幀兩個現有數據幀,其中新數據幀是第一個數據幀中的每一行,而不是第二個數據幀。我發現一些代碼here使用合併功能,允許我這樣做。基本上,如果最後的合併結果有結果,那麼該行的數據幀,我不把它添加到我的新的一個:R從兩個數據幀之間的唯一行創建新數據幀的高效方法

for (j in 1:nrow(my.df)) { 
    if(nrow(merge(my.df[j,],sample.df))==0) { 
     test.df <- rbind(test.df,my.df[j,]) 
    } 
} 

的問題是,for循環非常慢。考慮到我的限制,是否有更有效的方法來構建數據框架?

my.df

A B class 
1 2 x 
2 3 y 
3 4 z 

sample.df

A B class 
1 2 x 

test.df應該像

A B class 
2 3 y 
3 4 z 
+1

看看'?dplyr :: setdiff()'和'?dplyr :: anti_join() '以獲得更多的幫助,請發送一個理想輸出的可重現的例子:) – Nate

+0

代碼是可重複的,您只需要兩個數據幀,您將得到我期待的輸出(代碼原樣)。我只是在尋找更快的方法。 – xjtc55

+0

'my.df'看起來像什麼?怎麼樣'sample.df'? – Nate

回答

2

使用library(dplyr)我們可以使用anti_join()

anti_join(my.df, sample.df) 
# Joining, by = c("A", "B", "class") 
# A B class 
# 1 3 4  z 
# 2 2 3  y 

正如@Gregor提到的,您也可以將您的data.framesdata.tableslibrary(data.table)得到一些額外的速度

+0

的示例。有明顯的加速。現在夠了。我會嘗試轉換爲更快的表格。 – xjtc55

+0

有沒有辦法抑制#joinging,通過....消息? – xjtc55

+1

如果您指定'anti_join(...,by = c(「variable1,variable2))'',那麼會顯示警告以顯示它選擇匹配哪些列,默認情況下所有公用名稱在兩者之間共享data.frames – Nate

相關問題