17

次のものがあるとしますdata.table

dt <- data.table(id = c(rep(1, 5), rep(2, 4)),
                 sex = c(rep("H", 5), rep("F", 4)), 
                 fruit = c("apple", "tomato", "apple", "apple", "orange", "apple", "apple", "tomato", "tomato"),
                 key = "id")

   id sex  fruit
1:  1   H  apple
2:  1   H tomato
3:  1   H  apple
4:  1   H  apple
5:  1   H orange
6:  2   F  apple
7:  2   F  apple
8:  2   F tomato
9:  2   F tomato

各行は、誰か ( と で識別される) が を食べたという事実をid表しsexますfruitfruitそれぞれが に食べられた回数を数えたいsex。私はそれを行うことができます:

dt[ , .N, by = c("fruit", "sex")]

これにより、次のことが得られます。

    fruit sex N
1:  apple   H 3
2: tomato   H 1
3: orange   H 1
4:  apple   F 2
5: tomato   F 2

問題は、このようにすることでorangeforのカウントが失われることですsex == "F"。これは、このカウントが 0 であるためです。ゼロ カウントの組み合わせを失わずにこの集計を行う方法はありますか?

完全に明確にするために、望ましい結果は次のようになります。

   fruit sex N
1:  apple   H 3
2: tomato   H 1
3: orange   H 1
4:  apple   F 2
5: tomato   F 2
6: orange   F 0

どうもありがとう !

4

2 に答える 2

16

最も簡単なアプローチは、に渡された data.table 内のすべてのカテゴリ コンボを明示的に指定し、それらを反復処理するようi=に設定することです。by=.EACHI

setkey(dt, sex, fruit)
dt[CJ(sex, fruit, unique = TRUE), .N, by = .EACHI]
#    sex  fruit N
# 1:   F  apple 2
# 2:   F orange 0
# 3:   F tomato 2
# 4:   H  apple 3
# 5:   H orange 1
# 6:   H tomato 1
于 2013-05-14T15:40:13.677 に答える