【问题标题】:Use a factor column in "by" and do not drop empty factors在“by”中使用因子列,不要删除空因子
【发布时间】:2013-05-14 11:39:08
【问题描述】:

假设我有一个 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

【问题讨论】:

  • 为什么不在之后添加缺少的级别,例如merge(y,data.table(group=levels(x[,group])),by="group",all=TRUE),然后将NAs 变成0?
  • 我不知道一个通​​用的解决方案,但是对于 .N 单独来说,你可以依靠 table: x[,table(group)] (你可能已经知道了)。

标签: r data.table


【解决方案1】:

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

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

【讨论】:

  • @Henrik -- 好收获!感谢那。两个都改了。
【解决方案2】:

使用on= 参数(自 2015 年 9 月 19 日起使用 CRAN 版本 1.9.6 引入 data.table),我们可以实现与 Josh's answer 中相同的结果无需设置键

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多