R语言使用tidyr::spread或reshape2::dcast按id统计特征出现次数
R长表转宽表统计频次解决方案
核心报错原因
- 原数据未提前生成计数字段,长宽转换时没有可直接映射到单元格的数值列
reshape2::dcast调用sum聚合时,默认取字符类型的feature作为值列,数值运算无法作用于字符输入tidyr::spread报错是因为key/value参数配置错误,且没有唯一键标识每行的映射关系
解决方案
方案1:tidyverse 实现(官方推荐)
pivot_wider是tidyr官方推出替代spread的函数,稳定性更强:
library(tidyverse) # 先统计每个id+feature组合的出现次数,再转宽表 df %>% count(id, feature) %>% pivot_wider( names_from = feature, values_from = n, values_fill = 0 # 未出现的特征默认填充为0 ) # 若需使用spread语法实现 df %>% count(id, feature) %>% spread(key = feature, value = n, fill = 0)
方案2:reshape2::dcast 实现
不需要提前计数,直接指定聚合函数为length统计分组行数即可,不需要用sum:
library(reshape2) dcast( df, id ~ feature, fun.aggregate = length, value.var = "feature" )
两种方案输出结果一致,行对应id、列对应feature,单元格值为对应id下该feature的出现次数,未出现的feature值为0。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

