You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在data.table统计行数时包含计数为0的因子水平

实现data.table按因子分组统计并包含未出现水平(计数为0)

方法一:构建全因子水平表 + 左连接

先创建包含所有因子水平的基础表,再和过滤后的统计结果做左连接,最后将缺失的计数补0:

library(data.table)
DT = data.table(x = factor(rep(c("b", "a", "c"), each = 3)))

# 生成包含所有因子水平的表
all_levels = data.table(x = levels(DT$x))
# 统计过滤后的数据分组行数
count_data = DT[x != "c"][, .N, by = x]
# 左连接并填充0
final_result = all_levels[count_data, on = "x"][is.na(N), N := 0]
final_result

方法二:使用dcast直接统计

dcast会自动保留因子的所有水平,缺失的分组计数默认填充0,写法更简洁:

# 直接用dcast聚合
dcast(DT[x != "c"], x ~ ., fun.aggregate = length, value.var = "x")

# 或者用.SD简化写法
DT[x != "c"][, dcast(.SD, x ~ ., length)]

方法三:借助table转换

先通过table统计频数(会保留所有因子水平),再转换为data.table格式:

# 生成频数表
freq_table = table(DT[x != "c"]$x)
# 转换为data.table
data.table(x = names(freq_table), N = as.integer(freq_table))

注:如果需要保持因子原有的水平顺序,确保DT$x的因子水平已按需求定义,上述方法都会遵循因子的水平顺序输出结果。

内容的提问来源于stack exchange,提问作者iago

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:37:31