【问题标题】:data.table: merge() one-key table with two-keys tabledata.table: merge() 一键表和二键表
【发布时间】:2015-05-08 07:08:34
【问题描述】:

我还提到了this questions,它现在已经快 3 岁了。我也有类似的问题。

我有这三个表:

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?我应该重新指定表格的构建方式吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    不幸的是,merge by.x= by.y=merge 中的 data.frame 还没有为 data.tables 实现。它将在下一个版本 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)
    

    【讨论】:

      【解决方案2】:

      我想我不明白你的问题。你到底期待什么?

      键的命名无关紧要——在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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 2016-05-14
        • 1970-01-01
        • 2015-12-08
        相关资源
        最近更新 更多