当前位置:  开发笔记 > 编程语言 > 正文

使用data.table进行左连接

如何解决《使用data.table进行左连接》经验,为你挑选了2个好方法。

假设我有两个data.table:

A:

  A  B
1: 1 12
2: 2 13
3: 3 14
4: 4 15

B:

   A  B
1: 2 13
2: 3 14

我有以下代码:

merge_test = merge(dataA, dataB, by="A", all.data=TRUE)

我明白了:

   A B.x B.y
1: 2  13  13
2: 3  14  14

但是,我想在最终合并表中的dataA中的所有行.有没有办法做到这一点?



1> Jaap..:

如果你想添加b的值BA,那么最好加入AB和更新A引用如下:

A[B, on = 'a', bb := i.b]

这使:

> A
   a  b bb
1: 1 12 NA
2: 2 13 13
3: 3 14 14
4: 4 15 NA

这是比使用更好的appraoch,B[A, on='a']因为后者只是将结果打印到控制台.当你想要重新获得结果时A,你需要使用A <- B[A, on='a']哪个会给你相同的结果.

之所以A[B, on = 'a', bb := i.b]A <- B[A, on = 'a']内存效率更好.随着A[B, on = 'a', bb := i.b]位置A在内存中保持不变:

> address(A)
[1] "0x102afa5d0"
> A[B, on = 'a', bb := i.b]
> address(A)
[1] "0x102afa5d0"

另一方面A <- B[A, on = 'a'],创建一个新对象并将其保存在内存中A,因此在内存中有另一个位置:

> address(A)
[1] "0x102abae50"
> A <- B[A, on = 'a']
> address(A)
[1] "0x102aa7e30"

使用merge(merge.data.table)会导致内存位置发生类似的变化:

> address(A)
[1] "0x111897e00"
> A <- merge(A, B, by = 'a', all.x = TRUE)
> address(A)
[1] "0x1118ab000"

为了提高内存效率,最好使用'update-by-reference-join'语法:

A[B, on = 'a', bb := i.b] 

虽然这对于像这样的小型数据集没有显着差异,但它确实对data.table设计的大型数据集产生了影响.

可能还值得一提的是,A保持顺序相同.


使用数据:

library(bench)
bm <- mark(AA <- BB[AA, on = .(aa)],
           AA[BB, on = .(aa), cc := cc],
           iterations = 1)


@cbailiss是的,`ib`意味着在用连接更新`A`时它应该看起来是'B`的`b`列.以类似的方式,使用`x.前缀,您可以引用'A`列.
@Prevost tric使用的是`mget`,另请参阅我以前的评论链接下的答案的最后部分
@Prevost [请看这里的例子](/sf/ask/17360801/),我希望能回答你的问题
@Jaap当创建多个新列时,如何通过引用管理联接?在这里,创建了新的列bb:= ib,正如您所说的,它在对应于i的B data.table中查找对应的b列值。但是,当您有许多可能通过合并(通过引用)较大的“ data.tables”而创建的新列时,会发生什么?

2> danas.zuokas..:

你可以试试这个:

# used data
# set the key in 'B' to the column which you use to join
A <- data.table(a = 1:4, b = 12:15)
B <- data.table(a = 2:3, b = 13:14, key = 'a') 

B[A]

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有