如何用data.table对取值范围相同的多列变量单独统计频次
解决方案
针对你的需求,使用data.table的melt()和dcast()函数组合就能高效实现,具体步骤如下:
完整代码实现
library(data.table) # 输入数据 foo <- data.table(a = c(1,3,2,3,3), b = c(2,3,3,1,1), c = c(3,1,2,3,2)) # 一步完成转长、计数、转宽操作 result <- dcast( melt(foo, measure.vars = names(foo), variable.name = "col", value.name = "levels"), levels ~ col, value.var = "N", fill = 0 # 可选:若某level在列中无数据,填充0 ) print(result)
输出结果
levels a b c 1: 1 1 2 1 2: 2 1 1 2 3: 3 3 2 2
逻辑说明
melt():将原宽表转为长格式,把所有待统计的列(a、b、c)整合到col列,对应的值存入levels列;- 分组计数:
melt后的表会自动按col和levels分组统计频次(生成N列); dcast():将长格式结果转回宽格式,以levels为行,原列名为列,填充对应的频次值。
如果你的数据中可能存在某个level在某列无记录的情况,fill = 0参数可以确保这些位置被填充为0,避免缺失值。
内容的提问来源于stack exchange,提问作者sant_andria
相关产品推荐
相关产品推荐

