gpt4 book ai didi

r - 使用 data.table 进行左连接

转载 作者:行者123 更新时间:2023-12-03 07:13:31 24 4
gpt4 key购买 nike

假设我有两个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 中的所有行。有办法做到这一点吗?

最佳答案

如果您想添加 b B 的值至A ,那么最好加入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

这是比使用 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)

给出(仅显示相关测量值):

> bm[,c(1,3,5)]
# A tibble: 2 x 3
expression median mem_alloc
<bch:expr> <bch:tm> <bch:byt>
1 AA <- BB[AA, on = .(aa)] 4.98s 4.1GB
2 AA[BB, on = .(aa), `:=`(cc, cc)] 560.88ms 384.6MB

因此,在此设置中,“update-by-reference-join”的速度提高了约 9 倍,消耗的内存减少了 11 倍。

注意:不同设置中速度和内存使用的提升可能有所不同。

<小时/>

使用的数据:

# initial datasets
A <- data.table(a = 1:4, b = 12:15)
B <- data.table(a = 2:3, b = 13:14)

# large datasets for the benchmark
set.seed(2019)
AA <- data.table(aa = 1:1e8, bb = sample(12:19, 1e7, TRUE))
BB <- data.table(aa = sample(AA$a, 2e5), cc = sample(2:8, 2e5, TRUE))

关于r - 使用 data.table 进行左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34598139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com