2012-07-17 35 views
1

我有2個數據幀。如果存在於第二個數據幀R中,則排除行

df1-

col1 col2 col3 col4 col5 
name1 A  23  x  y 
name1 A  29  x  y 
name1 B  17  x  y 
name1 A  77  x  y

df2-

 
col1 col2 col3 
B  17  LL1 
Z  193  KK1  
A  77  LO9 
Y  80  LK2 

我想從DF1返回的行如果COL2和DF1的COL3不等於col1和DF2的COL2。

輸出應爲─

col1 col2 col3 col4 col5 
name1 A  23  x  y 
name1 A  29  x  y

解決方案我發現 -

unique.rows <- function (df1, df2) { 
    out <- NULL 
    for (i in 1:nrow(df1)) { 
    found <- FALSE 
    for (j in 1:nrow(df2)) { 
     if (all(df1[i,2:3] == df2[j,1:2])) { 
     found <- TRUE 
     break 
     } 
    } 
    if (!found) out <- rbind(out, df1[i,]) 
    } 
    out 
} 

該解決方案工作正常,但一開始,我就申請小dataframes。現在我的df1有大約10k行,df2有大約700萬行。它從最近2天開始運行並運行。任何人都可以請建議一個快速的方法來做到這一點

回答

3

嘗試

> df1[!paste(df1$col2,df1$col3)%in%paste(df2$col1,df2$col2),] 
    col1 col2 col3 col4 col5 
1 name1 A 23 x y 
2 name1 A 29 x y 
2

了可能是咬你是行:

if (!found) out <- rbind(out, df1[i,]) 

你不斷長出data.frame,這會導致操作系統爲對象分配新的內存。我建議您預先分配足夠空間的data.frame,然後將正確的輸出分配給正確的索引。這應該加快幾個數量級。

另外,R經常矢量化,因此不需要顯式循環。例如,請參閱@ttmaccer的答案。你也可以看看data.table,這對於這類操作來說閃電般快。

相關問題