2012-12-01 1 views
0

Year, ID, Count (아래의 첫 번째 3 열 참조)의 세 열이있는 data.table 테스트가 있습니다. 그래서 같은 ID와 올해에 걸쳐 요약 네 번째 열을 추가하려면 : 내가 가진 무엇 data.table()에서 sum()을 사용하여 참조를 지정하면 잘못된 결과가 발생합니다.

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

이상한 보인다 : 그 기능은 [자동으로 내 annualCount에 1을 추가 할 것으로 보인다. 예를 들어 ID 210이 Y1 인 경우 9 대신 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 : dput (테스트) 출력.

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

감사합니다. 내 질문을 업데이트했습니다. BTW, 또 다른 모의 데이터 세트를 사용하려고하면이 버그를 복제 할 수 없습니다. 나는 내 머리카락을 당길거야 – AdamNYC

+0

커피가 필요할지도 모른다! – agstudy

답변

3

data.table에 문제이 아니라, 인간의 오류)

복제하려면, 여기에 몇 가지 샘플 데이터입니다. 우리는 우리의 새로운 열을 작성하기 전에

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 

, 그냥 몇 가지를하자 : 나는 na.rm하지 na.remove입니다 NA들, 제거와 인수없이 sum 함수의 결과를 확인하기 위해 몇 가지 NA 값을 포함 시켰습니다 집계를 사용하여 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

관련 문제