我有一个包含3列的data.table测试:Year,ID,Count(参见下面的前3列)。我想添加第四列来汇总ID和Year,如下所示:
setkey(test, Year, ID)
test[, annualCount := sum(Count), by=list(Year, ID)]
我得到的看起来很奇怪:看起来这个函数[自动为我的annualCount加1。例如,带有Y1的ID 210应该给我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)]
然后[自动为我的总和加1。不幸的是,我无法从头开始使用此错误复制此数据集。
更新3:输出(测试)输出。
structure(list(Year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Y1", "Y2", "Y3"), class = "factor"),
ID = c(210, 210, 210, 210, 210, 210, 210, 210, 210,
3197, 3197, 3197, 3197, 3197, 3197),
Count = c(1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)),
.Names = c("Year","ID", "Count"), class = c("data.table", "data.frame"),
row.names = c(NA, -15L), .internal.selfref = <pointer: 0x7fb6dc000778>)
感谢。
答案 0 :(得分:3)
这不是data.table
的问题,而是人为错误;)
要复制,这里有一些示例数据。我已添加了一些NA
值,以查看sum
函数的结果,包含和不包含删除NA
的参数,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
在我们创建新专栏之前,让我们进行一些汇总,看看sum
的不同选项会发生什么。
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