2014-06-17 1 views
1

값을 집계하는 데 data.table을 사용하고 있지만, "by"변수가 집계에없는 레벨을 가지면 지정되어 있어도 생략됩니다. 요인 수준에서.집계 중에 빈 팩터 레벨을 유지하십시오.

아래 코드는 6 행의 data.table을 생성하며, 마지막 두 개는 f1 내에 중첩 된 f2의 두 가지 가능한 수준 중 하나만 가지고 있습니다. 집계 중에 {3,1} 조합이 삭제됩니다.

set.seed(1987) 
dt <- data.table(f1 = factor(rep(1:3, each = 2)), 
       f2 = factor(sample(1:2, 6, replace = TRUE)), 
       val = runif(6)) 

str(dt) 

Classes ‘data.table’ and 'data.frame': 6 obs. of 3 variables: 
$ f1 : Factor w/ 3 levels "1","2","3": 1 1 2 2 3 3 
$ f2 : Factor w/ 2 levels "1","2": 1 2 2 1 2 2 
$ val: num 0.383 0.233 0.597 0.346 0.606 ... 
- attr(*, ".internal.selfref")=<externalptr> 

dt 

    f1 f2  val 
1: 1 1 0.3829077 
2: 1 2 0.2327311 
3: 2 2 0.5965087 
4: 2 1 0.3456710 
5: 3 2 0.6058819 
6: 3 2 0.7437177 

dt[, sum(val), by = list(f1, f2)] # output is missing a row 

    f1 f2  V1 
1: 1 1 0.3829077 
2: 1 2 0.2327311 
3: 2 2 0.5965087 
4: 2 1 0.3456710 
5: 3 2 1.3495996 

# this is the output I'm looking for: 
    f1 f2  V1 
1: 1 1 0.3829077 
2: 1 2 0.2327311 
3: 2 2 0.5965087 
4: 2 1 0.3456710 
5: 3 1 0.0000000 # <- the missing row from above 
6: 3 2 1.3495996 

이 동작을 수행하는 방법이 있습니까?

답변

1

왜 data.table은 f1과 f2의 모든 조합에 대한 합계를 계산할 것으로 예상합니까?

원하는 경우 합계를 그룹화하기 전에 누락 행을 원본 데이터에 추가해야합니다. 예를 들면 다음과 같습니다.

setkey(dt, f1, f2) 
# omit "by = .EACHI" in data.table <= 1.9.2 
dt[CJ(levels(f1), levels(f2)), sum(val, na.rm=T), 
    allow.cartesian = T, by = .EACHI] 
##  f1 f2  V1 
## 1: 1 1 0.3829077 
## 2: 1 2 0.2327311 
## 3: 2 1 0.3456710 
## 4: 2 2 0.5965087 
## 5: 3 1 0.0000000 ## <- your "missing row" :) 
## 6: 3 2 1.3495996 
+0

다른 기능에서 보았 기 때문에이 동작이 예상됩니다. 예 :'table (dt $ f1, dt $ f2)'는 모든 조합에 대한 결과를 생성합니다. –

관련 문제