R data.table按多列合并

R data.table按多列合并,r,merge,data.table,R,Merge,Data.table,我试图两两匹配4个变量,并添加一个具有查找值的列。在base中,我会进行merge(df1,df2,by.x=c(“lsr”,“ppr”),by.y=c(“li”,“pro”)),其中df1有9个col和df2(2是lsr和pro)df2只有3个col、li、pro,我感兴趣的“值”是alpha 这很好,但随着我开始成为data.table的超级粉丝,我想用data.table的方式来做这件事,因为我有数百万行,所以基本合并很慢(我看到,by.x和by.y功能正在等待data.table,但可能

我试图两两匹配4个变量,并添加一个具有查找值的列。在base中,我会进行
merge(df1,df2,by.x=c(“lsr”,“ppr”),by.y=c(“li”,“pro”))
,其中
df1
有9个col和
df2
(2是
lsr
pro
df2
只有3个col、
li
pro
,我感兴趣的“值”是
alpha

这很好,但随着我开始成为
data.table
的超级粉丝,我想用
data.table
的方式来做这件事,因为我有数百万行,所以基本合并很慢(我看到,
by.x
by.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
中,我有许多关于
lsr
ppr
的重复行。我还尝试设置两个键,并以
data.table
的方式将它们连接起来,并使用
alpha
添加一个新列。但是没有成功。

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

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


从中,我们可以直接执行联接,而无需使用
on
参数设置键:

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


如果您不想安装devel版本,那么可以等到它作为1.9.6版在CRAN上发布。

如果您不需要外部联接,可以使用二进制联接执行左联接、右联接或内部联接。问题是你想要哪一个。虽然从你的基本R代码来看,你似乎想要一个内部连接?另外,您希望保留哪一列?您在
df1
中也没有
pro
列,谢谢。实际上,我相信,在这种情况下,内部联接和左侧联接是相同的,因为lsr和ppr的所有组合,或者li和pro的所有组合都包含在df1和df2中。在df1中没有pro是一个错误!!很抱歉,我的意思是,df1中的ppr,我将编辑并更正它。我想保留df1中的所有列,并将alpha添加为新列。如果您只需要在更新
alpha
列时向
df1
左连接,则它是一个简单的二进制连接。尝试设置键(df1、lsr、ppr);设置键(df2、li、pro);df1[df2,alpha:=i.alpha];df1因此,如果您的
df1
集合中已有
alpha
列,
i
将告诉
数据。表格
df2
中的
alpha
获取信息。将
i,
放在RHS上的列名之前总是比较安全的,以避免可能的意外结果。确定。现在我真的是data.table的粉丝。谢谢df1[df2,alpha:=i.alpha]是否应该向df1添加一列?它对我没有任何帮助。是的,请将错误报告提交给data.table存储库,提供可复制的示例和会话信息