使用data.table()中的sum()通过引用进行赋值会产生不正确的结果

时间:2012-12-01 04:49:48

标签: r data.table

我有一个包含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>)

感谢。

1 个答案:

答案 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