sxg*_*xgn 5 merge r data.table
我有一个问题让我发疯,真的需要你的帮助.简化的问题是这样的:
d1<-data.table(v1=c("a","b","c","d","d","b","a","c","a","d","b","a"),
v2=(seq(1:12)),V3=rep(1:4,times=3))
d2<-data.table(v1=c("a","b","c","d"),v3=c(3,2,1,4),v4=c("y","x","t","e"))
Run Code Online (Sandbox Code Playgroud)
这将产生两个数据集:
D1:
v1 v2 V3
1: a 1 1
2: b 2 2
3: c 3 3
4: d 4 4
5: d 5 1
6: b 6 2
7: a 7 3
8: c 8 4
9: a 9 1
10: d 10 2
11: b 11 3
12: a 12 4
> d2
v1 v3 v4
1: a 3 y
2: b 2 x
3: c 1 t
4: d 4 e
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,v1和v3中的元素是相同的.现在我想通过在D1中创建一个新列来联合两个数据集,该列返回d2中与索引v1和v3匹配的V4的值,我希望我能得到如下输出:
>
d3
v1 v2 V3 V4
1: a 1 1 na
2: b 2 2 x
3: c 3 3 na
4: d 4 4 e
5: d 5 1 na
6: b 6 2 x
7: a 7 3 y
8: c 8 4 na
9: a 9 1 na
10: d 10 2 na
11: b 11 3 na
12: a 12 4 na
Run Code Online (Sandbox Code Playgroud)
我使用的实际数据的大小相对非常大.它类似于联合113MB数据和23MB.我试图使用for循环来解决这个问题,因为数据太长了,完成任务需要很长时间.我也试过merge,sqldf但他们都未能完成这项工作.你能帮帮我解决这个问题吗?非常感谢你!
我这样做:
setkey(d1, v1, V3)
d1[d2, v4 := v4][]
Run Code Online (Sandbox Code Playgroud)
对于表单的连接,需要设置x[i]密钥x.i可能有也可能没有密钥集.所以我们在d1这里设置关键列v1和关键字V3.
接下来,我们执行一个连接d1[d2],对于每一行,d2找到与键列匹配的行,d1并返回连接结果.我们并没有准确地寻找那个结果.我们宁愿要添加一个新列,其中每个匹配的行得到它的价值d2的v4和,否则NA.为此,我们通过引用功能使用data.table的子赋值.在加入i时x,我们仍然可以提供表达式j,并参考i列.你也可以把它们称为i.v4(如果有两个名称相同的列通常使用x和i).
:=通过引用添加/更新列.LHS :=是我们想要在这里创建的列名,RHS v4是我们想要从中分配的值(这里是它的列d2).因此,对于每个匹配行,我们通过引用(就地,意味着不进行复制)将d2's ' 分配v4到d1新列(我们命名v4),并且那些没有匹配的行将获得默认值NA.
最后一个[]是将输出打印到屏幕,因为:=无形地返回结果.
希望这有助于了解这里发生了什么.