gpt4 book ai didi

r - 在 data.table 中使用 by 连接继承范围

转载 作者:行者123 更新时间:2023-12-03 01:28:40 24 4
gpt4 key购买 nike

我使用的是 data.table 1.9.3,也许我错了,但我不记得了以下是之前预期的。

我构建了 2 个 data.tables,dta 和 dtb

> dta
idx vala fdx
1: 1 2 a
2: 2 4 a
3: 3 6 b

> dtb
idx valb
1: 1 3
2: 4 6

> dput(x = dta)
structure(list(idx = c(1, 2, 3), vala = c(2, 4, 6), fdx = c("a",
"a", "b")), .Names = c("idx", "vala", "fdx"), row.names = c(NA,
-3L), class = c("data.table", "data.frame"), .internal.selfref =
<pointer: 0x0000000000110788>, sorted = "idx")

> dput(x = dtb)
structure(list(idx = c(1, 4), valb = c(3, 6)), .Names = c("idx",
"valb"), row.names = c(NA, -2L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000000000110788>, sorted = "idx")

两种情况下的关键都是 idx。

当然还有以下作品

> dta[dtb, sum(valb)]
[1] 9

然而这并不

> dta[dtb, sum(valb), by = fdx]
Error in `[.data.table`(dta, dtb, sum(valb), by = fdx) :
object 'valb' not found

但这确实

> dta[dtb][, sum(valb), by = fdx]
fdx V1
1: a 3
2: NA 6

如果我们看到中间步骤

> dta[dtb]
idx vala fdx valb
1: 1 2 a 3
2: 4 NA NA 6

我预料到了

dta[dtb, sum(valb), by = fdx] == dta[dtb][, sum(valb), by = fdx]

我哪里出错了?

最佳答案

只是猜测

library(data.table)

dta <- data.frame(idx=c(1,2,3),
vala=c(2,4,6),
fdx=c('a','a','b'))
dta <- data.table(dta)

dtb <- data.frame(idx=c(1,4),
valb=c(3,6))
dtb <- data.table(dtb)

setkey(dta,idx)
setkey(dtb,idx)

所以当你打电话时

dta[dtb, sum(valb)]

这有点像打电话

tmp <- dta[dtb]
attach(tmp)
sum(valb)
detach(tmp)

但是,如果你打电话

dta[dtb, sum(valb), by=fdx]

那就有点像打电话

tmp <- dta[dtb]
# attach(tmp) : attach doesn't happen
sum(valb)
# detach(tmp) : detach doesn't happen

该函数不知道如何处理附加参数。例如,这也会引发错误:

dta[dtb, class(fdx), sum(valb)]

但是,这有效

dta[dtb][, sum(valb), by=fdx]

有点像

tmp <- dta[dtb]
tmp[, sum(valb), by=fdx]

就像我说的,这只是对为什么该功能可能无法按预期工作的猜测。

关于r - 在 data.table 中使用 by 连接继承范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746882/

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