如何在R中重塑长格式数据并统计各类值的数量
解决R语言长格式字符串数据的计数汇总问题
先构造示例数据
# 还原你的输入数据框 df <- data.frame( Location = c("North", "North", "North", "South", "South", "North", "South", "North", "South", "South"), Colour = c("red", "blue", "red", "red", "red", "red", "blue", "blue", "red", "red"), stringsAsFactors = FALSE )
方法一:Base R 快速实现
用table()直接生成交叉计数表,再转换为数据框:
# 生成交叉计数表并转为数据框格式 count_table <- as.data.frame.matrix(table(df$Location, df$Colour)) # 将行名转为Location列 count_table$Location <- rownames(count_table) # 调整列顺序,把Location放在第一列 count_table <- count_table[, c("Location", "red", "blue")] # 清除行名 rownames(count_table) <- NULL
方法二:dplyr + tidyr 灵活处理(推荐)
先分组统计数量,再转换为宽格式,逻辑清晰易扩展:
library(dplyr) library(tidyr) result_df <- df %>% # 按Location和Colour分组,统计每组的行数 count(Location, Colour) %>% # 将Colour的不同取值转为列,填充对应的计数,无数据则填0 pivot_wider(names_from = Colour, values_from = n, values_fill = 0)
方法三:reshape2包的cast方法(适配你之前的尝试)
你之前没成功是因为缺少数值型的计数列,只需先给每行添加一个值为1的列,再用dcast汇总:
library(reshape2) # 添加计数辅助列 df$count <- 1 # 按Location分组,将Colour转为列,汇总count的和 result_cast <- dcast(df, Location ~ Colour, value.var = "count", fun.aggregate = sum)
内容的提问来源于stack exchange,提问作者Carrot Cake
相关产品推荐
相关产品推荐

