15

假设我有一个 data.table:

x <- data.table(x=runif(3), group=factor(c('a','b','a'), levels=c('a','b','c')))

x我想知道每个存在多少行group

x[, .N, by="group"]
#    group N
# 1:     a 2
# 2:     b 1

问题:是否有某种方法可以强制上述by="group"因素考虑所有级别的因素group

请注意,由于我在表中没有任何带有group“c”的行,因此我没有得到 c 的行。

期望的输出:

x[, .N, by="group", ???] # somehow use all levels in `group`
#    group N
# 1:     a 2
# 2:     b 1
# 3:     c 0
4

2 回答 2

16

如果您愿意通过枚举i(而不是设置by="group")来遍历因子水平,这将为您带来希望的结果。

setkey(x, "group")
x[levels(group), .N, by=.EACHI]
#    group N
# 1:     a 2
# 2:     b 1
# 3:     c 0
于 2013-05-14T12:52:34.823 回答
0

使用参数(截至 2015 年 9 月 19 日在 CRAN 版本 1.9.6 中引入 data.table),我们可以在不设置键的情况下获得与Josh 的答案on=相同的结果:

x[.(group = levels(group)), on = .(group), .N, by = .EACHI]
   group N
1:     a 2
2:     b 1
3:     c 0

或更短但不那么自解释

x[.(levels(group)), on = .(group = V1), .N, by = .EACHI]
于 2021-08-17T06:49:00.437 回答