在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
相关产品推荐
相关产品推荐

