R 在data.table()中引用sum()赋值会产生错误的结果
我有一个data.table测试,有3列:Year、ID、Count(见下面的前3列)。我想添加第四列来总结ID和年份,如下所示: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
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
函数的结果,该函数带有和不带参数removeNA
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