我刚刚注意到一个问题,data.table
中的一列原来是integer64类的。我正在使用fread
从Internet上的某个位置读取数据,但不知道所讨论的列被解释为integer64,这是我不熟悉的类。问题是使用data.table
和sum()
时此类在by
中的行为。在此处的其他两个问题中也类似地引用了该变量,但这是在将其用作ID值(Q1和Q2)的情况下
在此integer64列上按组执行sum()
时,当列中存在负值时,它的行为不符合预期(作为数字)。为什么是这样?是一个错误吗?
library(data.table); library(bit64)
z <- data.table(
group = c("A","A","A"),
int64 = as.integer64(c(10,20,-10)),
numeric = c(10,20,-10)
)
首先,无需使用by
语句即可正常工作:
z[, sum(int64)] #20
z[, sum(int64, na.rm=T)] #20
并且采用非data.table
格式
sum(z$int64)
sum(z$int64, na.rm = TRUE)
但是当包含by
语句时,它会变得混乱:
z[, sum(int64, na.rm=FALSE), by=group] #only the negative value
#group V1
#A -10
z[, sum(int64, na.rm=TRUE), by=group] #excluding the negative value
#group V1
#A 30
z[, sum(as.numeric(int64)), by=group] #expected answer
#group V1
#A 20
这让我感到担心,因为从表面上看,没有理由相信z$int64
中的数字有什么问题,我只是注意到行数很少。