我还提到现在差不多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"))
现在,我想将profile
和post
与comment
合并到两个不同的表中。如何指定comment
中匹配的密钥为profile_id
且post
中的密钥为post_id
?我应该重新指定表的构建方式吗?
答案 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]
x
和y
的第一个键匹配(然后是第二个键等)。< / 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