R 在data.table()中引用sum()赋值会产生错误的结果

R 在data.table()中引用sum()赋值会产生错误的结果,r,data.table,R,Data.table,我有一个data.table测试,有3列:Year、ID、Count(见下面的前3列)。我想添加第四列来总结ID和年份,如下所示: setkey(test, Year, ID) test[, annualCount := sum(Count), by=list(Year, ID)] 我得到的结果看起来很奇怪:似乎函数[自动将1添加到我的年度帐户中。例如,带Y1的ID210应该给我8而不是9 这是data.table中的错误吗 Year ID Count annual

我有一个data.table测试,有3列:Year、ID、Count(见下面的前3列)。我想添加第四列来总结ID和年份,如下所示:

setkey(test, Year, ID)
test[, annualCount := sum(Count), by=list(Year, ID)]
我得到的结果看起来很奇怪:似乎函数[自动将1添加到我的年度帐户中。例如,带Y1的ID210应该给我8而不是9

这是data.table中的错误吗

    Year       ID    Count  annualCount
 1:   Y1      210        1            9
 2:   Y1      210        1            9
 3:   Y1      210        0            9
 4:   Y1      210        1            9
 5:   Y1      210        1            9
 6:   Y1      210        1            9
 7:   Y1      210        1            9
 8:   Y1      210        1            9
 9:   Y1      210        1            9
10:   Y1     3197        1            6
11:   Y1     3197        1            6
12:   Y1     3197        0            6
13:   Y1     3197        1            6
14:   Y1     3197        1            6
15:   Y1     3197        1            6    
更新:我使用的是R版本2.15.0(2012-03-30),但我安装了data.table_1.8.6。当我安装此软件包时,我收到一条警告,说明此版本是基于2.15.1构建的。这是导致此错误的原因吗

更新2:我安装了最新的R(现在是2.15.2),但没有帮助。使用相同的数据集, 如果我打电话

  test1 <- test[, list(annualCount = sum(Count)), by=list(Year, ID)]
test2 <- test[, list(annualCount = sum(Count, na.remove = T)), by=list(Year, ID)]

test1这不是
数据表的问题,而是人为错误;)

为了复制,这里有一些示例数据。我包含了一些
NA
值,以查看
sum
函数的结果,该函数带有和不带参数remove
NA
s,即
NA.rm
,而不是
NA.remove

set.seed(1)
test <- data.table(Year = rep("Y1", 15),
                   ID = c(rep(210, 9), rep(3197, 6)),
                   Count = sample(c(0, 1, NA), 15, 
                                  prob=c(.2, .65, .15), 
                                  replace=TRUE),
                   key = "Year,ID")
test
#     Year   ID Count
#  1:   Y1  210     1
#  2:   Y1  210     1
#  3:   Y1  210     1
#  4:   Y1  210    NA
#  5:   Y1  210     1
#  6:   Y1  210    NA
#  7:   Y1  210    NA
#  8:   Y1  210     0
#  9:   Y1  210     1
# 10:   Y1 3197     1
# 11:   Y1 3197     1
# 12:   Y1 3197     1
# 13:   Y1 3197     0
# 14:   Y1 3197     1
# 15:   Y1 3197     0
现在,创建一个新的列,其中包含预期的结果

test[, annualCount := sum(Count, na.rm = TRUE), by = key(test)][]
#     Year   ID Count annualCount
#  1:   Y1  210     1           5
#  2:   Y1  210     1           5
#  3:   Y1  210     1           5
#  4:   Y1  210    NA           5
#  5:   Y1  210     1           5
#  6:   Y1  210    NA           5
#  7:   Y1  210    NA           5
#  8:   Y1  210     0           5
#  9:   Y1  210     1           5
# 10:   Y1 3197     1           4
# 11:   Y1 3197     1           4
# 12:   Y1 3197     1           4
# 13:   Y1 3197     0           4
# 14:   Y1 3197     1           4
# 15:   Y1 3197     0           4

对我来说没有bug,我的数据得到了8和5!谢谢agstudy。我更新了我的问题。顺便说一句,当我尝试另一个模拟数据集时,我无法复制此bug。我正在发毛:-)我正在尝试安装最新的R,看看它是否能解决我的问题。我也得到了正确的答案。清除你的工作区,然后重试?什么是
na。删除
?我知道了正确的参数是
na.rm
?再次感谢。我意识到sum(1,na.remove=T)产生2。这是因为R假设na.remove是一个值为T的新逻辑变量,并在输入SUM函数时将其强制为1。@AdamNYC,我认为还有一两个包可能定义
na.remove
,因此错误是可以理解的:)
test[, list(annualCount = sum(Count)), by = key(test)]
#    Year   ID annualCount
# 1:   Y1  210          NA
# 2:   Y1 3197           4
test[, list(annualCount = sum(Count, na.rm = TRUE)), by = key(test)]
#    Year   ID annualCount
# 1:   Y1  210           5
# 2:   Y1 3197           4
test[, annualCount := sum(Count, na.rm = TRUE), by = key(test)][]
#     Year   ID Count annualCount
#  1:   Y1  210     1           5
#  2:   Y1  210     1           5
#  3:   Y1  210     1           5
#  4:   Y1  210    NA           5
#  5:   Y1  210     1           5
#  6:   Y1  210    NA           5
#  7:   Y1  210    NA           5
#  8:   Y1  210     0           5
#  9:   Y1  210     1           5
# 10:   Y1 3197     1           4
# 11:   Y1 3197     1           4
# 12:   Y1 3197     1           4
# 13:   Y1 3197     0           4
# 14:   Y1 3197     1           4
# 15:   Y1 3197     0           4