data.table:merge()一键表和双键表

时间:2015-05-08 07:08:34

标签: r data.table

我还提到现在差不多3岁的this questions。我有类似的问题。

我有这三个表:

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"))

现在,我想将profilepostcomment合并到两个不同的表中。如何指定comment中匹配的密钥为profile_idpost中的密钥为post_id?我应该重新指定表的构建方式吗?

2 个答案:

答案 0 :(得分:3)

不幸的是,merge by.x= by.y= merge data.frame data.table尚未实现setnames(profile, "id", "profile_id") setnames(post, "id", "post_id") merged_dt1 <- merge(profile, comment) merged_dt2 <- merge(post, comment) 。它将在下一版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的合并应该有效。

adb kill-server

答案 1 :(得分:1)

我不认为我理解你的问题。您对此有何期待?

键的命名无关紧要 - 在x[y] xy的第一个键匹配(然后是第二个键等)。< / p>

以下内容与您的期望有何不同?我已对您的示例表进行了编辑,以明确说明发生了什么:

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