data.table 与 'by' 参数的奇怪行为?
Strange behavior of data.table with 'by' argument?
我只想要一个函数对 data.table 中的行求和,使用 by
参数覆盖旧值。通常我希望在所有行中得到与 by
相同的结果。我创建了 2 个示例。第一个与第二个的唯一区别是删除了 data.table 的 take 列中的前 3 位数字。第一个示例按预期工作,第二个示例显示了一些意外行为。我很乐意得到任何关于我做错了什么的提示。
R 版本:4.0.4
data.table版本:1.14.2
library(data.table)
# my expected function
superpose <- function(DT){
DT <- copy(DT)
DT[, value := sum(value), by = take]
}
v1a = c( 55: 59, 33: 37, 54: 56, 32: 34, 58: 60, 36: 38)
v1b = c(25555:25559, 20533:20537, 25554:25556, 20532:20534, 25558:25560, 20536:20538)
all.equal(as.integer(factor(v1a)), as.integer(factor(v1b)))
# [1] TRUE
v2 = 1:22
data1 <- data.table(take = v1a, value = v2) # 1st data - expected behavior
data2 <- data.table(take = v1b, value = v2) # 2nd data - unexpected behavior
res1 <- superpose(data1)
res2 <- superpose(data2)
cbind(res1, res2)
which(res1[, value] != res2[, value])
# [1] 8 11 15 16 19 20 21 22
github 上已经有一个与 data.table 1.14.3
中的此错误相关的 open issue。这个问题现在已经在最新的开发版本中得到修复,可以使用以下方式安装:
update.dev.pkg()
这是一个警示故事,说明为什么只有内心勇敢的人才应该使用开发代码 - 如果您这样做,预计会出现问题。
我只想要一个函数对 data.table 中的行求和,使用 by
参数覆盖旧值。通常我希望在所有行中得到与 by
相同的结果。我创建了 2 个示例。第一个与第二个的唯一区别是删除了 data.table 的 take 列中的前 3 位数字。第一个示例按预期工作,第二个示例显示了一些意外行为。我很乐意得到任何关于我做错了什么的提示。
R 版本:4.0.4
data.table版本:1.14.2
library(data.table)
# my expected function
superpose <- function(DT){
DT <- copy(DT)
DT[, value := sum(value), by = take]
}
v1a = c( 55: 59, 33: 37, 54: 56, 32: 34, 58: 60, 36: 38)
v1b = c(25555:25559, 20533:20537, 25554:25556, 20532:20534, 25558:25560, 20536:20538)
all.equal(as.integer(factor(v1a)), as.integer(factor(v1b)))
# [1] TRUE
v2 = 1:22
data1 <- data.table(take = v1a, value = v2) # 1st data - expected behavior
data2 <- data.table(take = v1b, value = v2) # 2nd data - unexpected behavior
res1 <- superpose(data1)
res2 <- superpose(data2)
cbind(res1, res2)
which(res1[, value] != res2[, value])
# [1] 8 11 15 16 19 20 21 22
github 上已经有一个与 data.table 1.14.3
中的此错误相关的 open issue。这个问题现在已经在最新的开发版本中得到修复,可以使用以下方式安装:
update.dev.pkg()
这是一个警示故事,说明为什么只有内心勇敢的人才应该使用开发代码 - 如果您这样做,预计会出现问题。