You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:11:13