data.table由多列

时间:2015-05-21 10:17:40

标签: r merge data.table

我对编程很新,也对R中的data.table很新 - 所以也许这个问题非常简单,但我搜索并找不到任何解决方案。
我试图成对匹配4个变量并添加一个具有查找值的列。在基础上,我会merge(df1,df2, by.x=c("lsr","ppr"),by.y=c("li","pro")),其中df1有9个字母,df2(2个为lsrprodf2只有3个,lipro和"值"我对alpha感兴趣。

这样做很好,但是当我开始成为data.table的忠实粉丝时,我想以data.table的方式做到这一点 - 因为我有几百万行 - 所以基本合并很慢(我看到,by.xby.y功能正在等待data.table,但可能有一个解决方法)。请参阅以下一些示例数据:

df2:
         alpha         li        pro
      1: 0.5000000 0.01666667 0.01666667
      2: 0.3295455 0.03333333 0.01666667
      3: 0.2435897 0.05000000 0.01666667
      4: 0.1917808 0.06666667 0.01666667
      5: 0.1571429 0.08333333 0.01666667
df1:     
          demand rtime    mcv         mck        ppr       mlv         mlk        lsr
      1:    0.3     1 357.57700 0.099326944 0.01666667 558.27267 0.155075741 0.01666667
      2:    0.3    10 548.75433 0.152431759 0.01666667 614.30667 0.170640741 0.03333333
      3:    0.3    11 314.55767 0.087377130 0.01666667 636.48100 0.176800278 0.03333333
      4:    0.3     2 312.15033 0.086708426 0.01666667 677.48100 0.188189167 0.06666667
      5:    0.3     3 454.47867 0.126244074 0.01666667 608.92067 0.169144630 0.01666667
     ---                                                                               
6899196:    0.6     5 537.92673 0.149424093 1.00000000 537.92673 0.149424093 1.00000000
6899197:    0.6     6 277.34732 0.077040923 1.00000000 277.34732 0.077040923 1.00000000
6899198:    0.6     7  73.31484 0.020365235 1.00000000  73.31484 0.020365235 1.00000000
6899199:    0.6     8  32.04197 0.008900546 1.00000000  32.04197 0.008900546 1.00000000
6899200:    0.6     9  14.59008 0.004052799 1.00000000  14.59008 0.004052799 1.00000000

最后,可能感兴趣的是,在df2我有唯一的行,而在df1中,我有很多关于lsrppr的重复项。我还尝试设置两个密钥并以data.table方式加入它们,并添加一个带有alpha的新列。但没有成功。谢谢你的帮助!

1 个答案:

答案 0 :(得分:17)

您可以使用David Arenburg在评论中提供的声明:

setkey(df1, lsr, ppr)
setkey(df2, li, pro)
df1[df2, alpha := i.alpha]

current devel version, 1.9.5开始,我们可以直接执行连接,而无需使用on参数设置密钥:

df1[df2, alpha := i.alpha, on = c(lsr="li", ppr="pro")]

如果您不想安装devel版本,那么您可以等到CRAN上将其推送为v1.9.6。