2012-12-01 46 views
0

我有一個data.table測試,包含3列:Year,ID,Count(請參見下面的前3列)。我想加入第四欄跨越ID和年度總結,像這樣:通過data.table()中的sum()引用賦值不正確的結果

setkey(test, Year, ID) 
test[, annualCount := sum(Count), by=list(Year, ID)] 

我有什麼看起來奇怪:它似乎功能[自動加1我annualCount。例如,與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

對我沒有任何問題,我得到8和5與您的數據! – agstudy

+0

謝謝agstudy。我更新了我的問題。順便說一句,當我嘗試另一個模擬數據集時,我無法複製這個錯誤。我拉我的頭髮 – AdamNYC

+0

也許你需要一杯咖啡! – agstudy

回答

3

這不是一個data.table問題,而是人爲的錯誤;)

進行復制,這裏是一些樣本數據。我已經包含了一些NA值,看與不爭論的sum函數的結果,除去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 

之前,我們創建了新的專欄中,我們只是做了一些聚合以查看sum的不同選項會發生什麼情況。

現在,創建您的新列,並獲得您期望的結果。

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 
+0

再次感謝。我意識到sum(1,na.remove = T)產生2.這是因爲R假定na.remove是一個新值爲T的邏輯變量,當輸入到SUM函數時強制爲1。 – AdamNYC

+0

@AdamNYC,我想還有一兩個可能會定義'na.remove'的包,所以錯誤是可以理解的:) – A5C1D2H2I1M1N2O1R2T1