R data.table分组统计类别占比时直接命名汇总列的方法
解决方案
直接在lapply的迭代输入阶段为序列绑定对应列名即可,data.table会自动识别命名列表的名称作为输出列名,无需额外新增单独重命名列的代码行,且完全兼容任意类别数量的统计场景。
完整可运行代码
require(data.table) n_categories <- 5 dt <- data.table(categories = sample(paste("Category", 1:n_categories), 1000, replace = TRUE), group_var = rep(1:10, 100)) dt[, lapply(setNames(1:n_categories, paste0("proportion_category_", 1:n_categories)), function(x) table(categories)[[x]]/.N), by = group_var]
实现说明
- 核心逻辑是用
setNames()给传入lapply的序号向量动态绑定列名,lapply返回的结果会自带名称属性,data.table分组计算时会直接沿用这些名称作为列名,不会生成默认的V1/V2类列名。 - 列名随
n_categories参数自动生成,不管类别总数是多少,都会按规则输出proportion_category_1到proportion_category_n的规范列名,通用逻辑不需要随类别数调整。 - 若存在个别分组缺失某类别的情况,可将计算逻辑中的
table(categories)替换为table(factor(categories, levels = paste("Category", 1:n_categories))),避免因分组类别不全导致的占比计算错位,缺类的分组对应占比会正确返回0。
输出效果
运行代码后会直接返回符合要求格式的结果:
group_var proportion_category_1 proportion_category_2 proportion_category_3 proportion_category_4 proportion_category_5 1: 1 0.22 0.19 0.18 0.24 0.17 2: 2 0.17 0.23 0.18 0.23 0.19 3: 3 0.17 0.22 0.21 0.17 0.23 4: 4 0.17 0.17 0.24 0.19 0.23 5: 5 0.26 0.19 0.16 0.19 0.20 6: 6 0.14 0.19 0.24 0.21 0.22 7: 7 0.12 0.14 0.28 0.30 0.16 8: 8 0.13 0.19 0.19 0.17 0.32 9: 9 0.23 0.26 0.24 0.17 0.10 10: 10 0.16 0.20 0.21 0.25 0.18
内容的提问来源于stack exchange,提问作者ReelSaemon
相关产品推荐
相关产品推荐

