2014-11-03 35 views
3

我有個問題讓我發狂,真的需要你的幫助。 簡化的問題是:如何合併兩個大型數據集,同時在r中生成具有不同重複值的新列

d1<-data.table(v1=c("a","b","c","d","d","b","a","c","a","d","b","a"), 
        v2=(seq(1:12)),V3=rep(1:4,times=3)) 

d2<-data.table(v1=c("a","b","c","d"),v3=c(3,2,1,4),v4=c("y","x","t","e")) 

這將產生兩個數據集:

D1:  
    v1 v2 V3 
1: a 1 1 
2: b 2 2 
3: c 3 3 
4: d 4 4 
5: d 5 1 
6: b 6 2 
7: a 7 3 
8: c 8 4 
9: a 9 1 
10: d 10 2 
11: b 11 3 
12: a 12 4 

> d2 
    v1 v3 v4 
1: a 3 y 
2: b 2 x 
3: c 1 t 
4: d 4 e 

正如你可以看到,在V1和V3的元素是一樣的。現在我想聯合兩個數據通過創建在D1新列設置它返回D2 V4的值相匹配這兩個指數V1和V3的是,我希望我能得到的輸出看起來像這樣:

> 

d3 
    v1 v2 V3 V4 
1: a 1 1 na 
2: b 2 2 x 
3: c 3 3 na 
4: d 4 4 e 
5: d 5 1 na 
6: b 6 2 x 
7: a 7 3 y 
8: c 8 4 na 
9: a 9 1 na 
10: d 10 2 na 
11: b 11 3 na 
12: a 12 4 na 

的我使用的實際數據的大小相對非常大。這是像23MB的聯合113MB數據。我試圖使用for循環來解決這個問題,因爲數據太長了,需要很長時間才能完成任務。我也試過mergesqldf,但他們都沒有完成這項工作。你能幫我解決這個問題嗎?非常感謝你!

+0

sqldf花了這麼長時間的原因可能是您沒有在連接列上放置索引。在主頁上有一些例子,並且有很多關於例子的問題。 – 2014-11-03 22:28:15

+0

非常感謝信息 – sxgn 2014-11-04 09:59:41

回答

6

我會做這樣的:

setkey(d1, v1, V3) 
d1[d2, v4 := v4][] 
  • 對於加盟的形式x[i]的,鍵被設置x需求。 i可能有也可能沒有密鑰集。所以我們在這裏將d1的密鑰設置爲v1V3列。

  • 接下來,我們執行加入d1[d2],其中d2的每一行都找到與d1的鍵列匹配的行並返回連接結果。我們並不是完全在尋找那個結果。我們希望添加一個新列,其中每個匹配行從d2v4和其他NA獲得值。爲此,我們使用data.table的通過引用功能進行的子分配。在加入ix時,我們仍然可以在j中提供表達式,並參考i的列。您也可以將它們稱爲i.v4(通常在xi中都有相同名稱的列時使用)。

  • :=通過引用添加/更新列。 :=的LHS是我們要在此處創建的列名稱,RHS v4是我們要分配的值(這裏是d2的列)。因此,對於每個匹配行,我們將d2v4分配到d1的新列(我們命名爲)v4通過引用(in-place,意思是沒有製作副本),而那些沒有匹配的行將獲得默認值NA

  • 最後的[]只是將輸出打印到屏幕上,因爲:=以不可見的方式返回結果。

希望這有助於瞭解這裏發生了什麼。

+0

+1的解釋。 – akrun 2014-11-04 09:22:02

+0

非常感謝您的詳細解釋,它工作得非常好。再次感謝!!! – sxgn 2014-11-04 10:03:18

相關問題