2015-05-08 74 views
4

我也參考現在已近3歲的this questions。我有一個類似的問題。data.table:合併()一鍵表與雙鍵表

我有這三個表:

require(data.table) 

profile <- data.table(id = seq(11,20)) 
setkey(profile, "id") 

post <- data.table(id = seq(1,10)) 
setkey(post, "id") 

comment <- data.table(post_id = seq(1,10), 
         profile_id = seq(11,20)) 
setkeyv(comment, c("post_id","profile_id")) 

現在我想用comment合併profilepost成兩個不同的表。如何指定在comment中匹配的密鑰是profile_id,並且在postpost_id?我應該重新指定表格的構建方式嗎?

回答

3

不幸的是,merge by.x= by.y=merge中的data.frame沒有對data.table s執行。它將在下一個版本1.9.6中提到。請看這裏:https://github.com/Rdatatable/data.table/issues/637

你可以做的是將data.tables轉換爲data.frames,使用by.x和by.y(請參閱merge.data.frame)合併,然後轉換回data.tables 。

或者,按名稱爲其匹配的方式命名鍵/列。然後,data.table的合併應該工作。

setnames(profile, "id", "profile_id") 
setnames(post, "id", "post_id") 

merged_dt1 <- merge(profile, comment) 
merged_dt2 <- merge(post, comment) 
1

我不認爲我理解你的問題。你期望什麼?

命名的密鑰應該沒有關係 - 在x[y]xy的第一個鍵匹配(然後第二個鍵等)。

以下情況與您的期望有什麼不同?我編輯了您的示例表格,以清楚地說明發生了什麼:

profile <- data.table(id = seq(11,20), v_prof = sample(100:109), key = "id") 

post <- data.table(id = seq(1,10), v_pos t= sample(200:209), key = "id") 

comment <- data.table(post_id = seq(1, 10), 
         profile_id = seq(11, 20)) 

setkey(comment, post_id)[post] 
#(the reverse would work too: post[setkey(comment, post_id)]) 
    post_id profile_id v_post 
1:  1   11 207 
2:  2   12 208 
3:  3   13 201 
4:  4   14 205 
5:  5   15 206 
6:  6   16 200 
7:  7   17 202 
8:  8   18 203 
9:  9   19 209 
10:  10   20 204 

setkey(comment, profile_id)[profile] 
    post_id profile_id v_prof 
1:  1   11 107 
2:  2   12 101 
3:  3   13 109 
4:  4   14 102 
5:  5   15 103 
6:  6   16 104 
7:  7   17 100 
8:  8   18 108 
9:  9   19 105 
10:  10   20 106