在R中合并两个具有多对一关系的data.tables?

时间:2014-02-04 21:11:49

标签: r data.table

我有两个data.table(s)表'DT1'是主数据库,我想合并来自第二个表'DT2'的数据,该表具有与'DT1'中的一个或多个行匹配的行。我想保留DT1的所有列并从DT2添加其他列(最终将重复这些列)。

DT1:
ID          DEP CAT BCC value
ZCC81899ZZ  31,HH2  2,039   BCC1    0
ZZ02362D    2FF2,2F 02,06   BCC1    0
ZZ42716D    384,338 2   BCC1    0
ZZ64457TZZ  389,391 01,02   BCC1    1
ZCC81899ZZ  31,HH2  20,390  BCC2    1
ZZ02362D    2FF2,2  2   BCC2    1
ZZ42716D    384,338 2   BCC2    1
ZZ64457TZZ  389,391 01,02   BCC2    1
ZZ66595ZZ   14,191  11,072  BCC2    0
ZCC81899ZZ  31,HH2  203 BCC6    0
ZZ02362D    2FF2    2   BCC6    1
ZZ42716D    384,338 2   BCC6    0
ZZ64457TZZ  389,391 01,02   BCC6    0
ZZ66595ZZ   141,914 11,072  BCC6    0


DT2:
BCC    LABEL     CO     IN
BCC1   Dim1      0.47   1.904
BCC2   Dim2      0.535  0.575
BCC6   Dim3      0.44   0.344

所以我想将这两个data.table(s)与密钥BCC合并,结果应为:

DT1:
ID          DEP CAT BCC value    LABEL    CO    IN
ZCC81899ZZ  31,HH2  2,039   BCC1    0        Dim1     0.47  1.904
ZZ02362D    2FF2,2F 02,06   BCC1    0        Dim1     0.47  1.904
ZZ42716D    384,338 2   BCC1    0        Dim1     0.47  1.904
ZZ64457TZZ  389,391 01,02   BCC1    1        Dim1     0.47  1.904
ZCC81899ZZ  31,HH2  20,390  BCC2    1        Dim2     0.535 0.575
ZZ02362D    2FF2,2  2   BCC2    1        Dim2     0.535 0.575
ZZ42716D    384,338 2   BCC2    1        Dim2     0.535 0.575
ZZ64457TZZ  389,391 01,02   BCC2    1        Dim2     0.535 0.575
ZZ66595ZZ   14,191  11,072  BCC2    0        Dim2     0.535 0.575
ZCC81899ZZ  31,HH2  203 BCC6    0        Dim3     0.44  0.34
ZZ02362D    2FF2    2   BCC6    1        Dim3     0.44  0.34
ZZ42716D    384,338 2   BCC6    0        Dim3     0.44  0.34
ZZ64457TZZ  389,391 01,02   BCC6    0        Dim3     0.44  0.34
ZZ66595ZZ   141,914 11,072  BCC6    0        Dim3     0.44  0.34

我正在做以下事情:

> setkey(DT1, BCC)
> setkey(DT2, BCC)
> DT1[DT2, `:=`(LABEL= i.LABEL, CO = i.CO), IN = i.IN)]

给出与DT1相同的结果,我尝试DT1 [DT2]也给出了相同的结果。我不知道我在哪里错过了这个。这应该是我的工作。任何帮助表示赞赏。

* 问题是我在使用“熔化”操作后生成DT1,并且当我调用BCC值(因子:数据类型)并且所有来自时。当我将两个表作为命令传递时它工作正常。所以我认为这是融化操作后结果的问题。还有其他方法可以在data.table中重塑数据吗?

1 个答案:

答案 0 :(得分:0)

merge命令允许一对多合并,默认情况下它只保留内连接(当2个表匹配时),但是使用命令all =; all.x和all.y允许你做任何你想要的选择

合并帮助页面明确了