如何在R中将字符列按类别拆分并统计分组频次?
解决R数据框按类别拆分并统计次数的问题
你遇到的spread报错是因为同一个name和type的组合存在重复行,spread要求每个键值组合唯一。解决思路是先统计每个name对应各type的出现次数,再进行列转换,下面提供两种可行方法:
方法一:使用tidyverse工具链(推荐)
用dplyr统计次数,再用tidyr::pivot_wider替代spread(spread已被pivot_wider替代,功能更灵活):
library(dplyr) library(tidyr) # 原始数据 df1 <- structure(list(name = c("ene", "due", "rabe", "rabe", "kum", "kum", "kum", "rike", "smake"), type = c("a", "b", "d", "a", "c", "c", "b", "d", "a")), class = "data.frame", row.names = c(NA, -9L)) # 转换步骤 df2 <- df1 %>% count(name, type) %>% # 先统计每个name下各type的出现次数,生成唯一组合 pivot_wider( names_from = type, # 将type的取值转为列名 values_from = n, # 对应的值为统计的次数 names_prefix = "type_", # 给新列名添加前缀 values_fill = 0 # 没有对应type的name填充0 ) # 查看结果 df2
方法二:基础R实现
用table函数直接生成交叉频数表,再转换为数据框:
# 原始数据 df1 <- structure(list(name = c("ene", "due", "rabe", "rabe", "kum", "kum", "kum", "rike", "smake"), type = c("a", "b", "d", "a", "c", "c", "b", "d", "a")), class = "data.frame", row.names = c(NA, -9L)) # 生成频数表并转换为数据框 freq_tab <- table(df1$name, df1$type) df2_base <- as.data.frame.matrix(freq_tab) # 调整列名和结构 colnames(df2_base) <- paste0("type_", colnames(df2_base)) df2_base$name <- rownames(df2_base) df2_base <- df2_base[, c("name", "type_a", "type_b", "type_c", "type_d")] # 调整列顺序 # 查看结果 df2_base
两种方法都能得到你需要的df2格式数据。
内容的提问来源于stack exchange,提问作者ramen
相关产品推荐
相关产品推荐

