gpt4 book ai didi

r - 通过引用合并总和与 data.table

转载 作者:行者123 更新时间:2023-12-04 15:13:18 24 4
gpt4 key购买 nike

假设我有两个 data.tabledt_adt_b 定义如下。

library(data.table)
set.seed(20201111L)

dt_a <- data.table(
foo = c("a", "b", "c")
)

dt_b <- data.table(
bar = sample(c("a", "b", "c"), 10L, replace=TRUE),
value = runif(10L)
)

dt_b[]
## bar value
## 1: c 0.4904536
## 2: c 0.9067509
## 3: b 0.1831664
## 4: c 0.0203943
## 5: c 0.8707686
## 6: a 0.4224133
## 7: a 0.6025349
## 8: b 0.4916672
## 9: a 0.4566726
## 10: b 0.8841110

我想通过引用在 dt_a 上加入 dt_b,对多重匹配求和。这样做的一种方法是首先创建 dt_b 的摘要(从而解决多重匹配问题),然后合并。

dt_b_summary <- dt_b[, .(value=sum(value)), bar]
dt_a[dt_b_summary, value_good:=value, on=c(foo="bar")]
dt_a[]
## foo value_good
## 1: a 1.481621
## 2: b 1.558945
## 3: c 2.288367

但是,这将允许内存到对象dt_b_summary,这是低效的。

我想通过直接加入 dt_b 并对多个匹配求和来获得相同的结果。我正在寻找类似下面的内容,但这行不通。

dt_a[dt_b, value_bad:=sum(value), on=c(foo="bar")]
dt_a[]
## foo value_good value_bad
## 1: a 1.481621 5.328933
## 2: b 1.558945 5.328933
## 3: c 2.288367 5.328933

有人知道是否有可能吗?

最佳答案

我们可以使用 .EACHIby

library(data.table)
dt_b[dt_a, .(value = sum(value)), on = .(bar = foo), by = .EACHI]
# bar value
#1: a 1.481621
#2: b 1.558945
#3: c 2.288367

如果我们想更新原始对象'dt_a'

dt_a[, value := dt_b[.SD,  sum(value), on = .(bar = foo), by = .EACHI]$V1]
dt_a
# foo value
#1: a 1.481621
#2: b 1.558945
#3: c 2.288367

对于多列

dt_b$value1 <- dt_b$value
nm1 <- c('value', 'value1')
dt_a[, (nm1) := dt_b[.SD, lapply(.SD, sum),
on = .(bar = foo), by = .EACHI][, .SD, .SDcols = nm1]]

关于r - 通过引用合并总和与 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64794673/

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