R语言(是否可用dplyr)如何将分组数据的分类列转为列表头
长表转宽矩阵的R实现方案
可借助dplyr所属的tidyverse生态工具简便实现目标转换,以下为可直接复用的操作代码:
基于dplyr生态的标准实现
完全可以借助dplyr完成转换,搭配同生态的tidyr工具即可通过简洁的管道操作实现长表转宽表,语法连贯性强,无额外学习成本:
# 加载所需包(需提前安装:install.packages(c("dplyr", "tidyr"))) library(dplyr) library(tidyr) # 长表转目标宽表核心代码 wide_result <- df %>% # 调整Group列取值为数值序号,匹配目标表格样式 mutate(Group = as.numeric(gsub("G", "", Group))) %>% # 执行长转宽操作 pivot_wider( names_from = Category, # 指定把Category列的各个取值作为新表的列名 values_from = Value # 指定用Value列的对应值填充新表单元格 )
运行上述代码得到的wide_result结构完全匹配给出的目标效果:第一列为Group序号1/2/3,后续列依次为Category 1-5对应的数值。
无额外包依赖的基础R实现
如果不想加载第三方包,可直接用R原生的reshape()函数完成转换:
# 原生函数转宽表 wide_native <- reshape( data = df, idvar = "Group", # 指定作为行标识的列 timevar = "Category",# 指定要拆分为列的来源列 direction = "wide" ) # 统一格式匹配目标 wide_native$Group <- as.numeric(gsub("G", "", wide_native$Group)) colnames(wide_native) <- gsub("Value\\.", "", colnames(wide_native))
兼容旧版本的实现
如果是使用历史版本的reshape2包,可通过dcast()完成转换:
library(reshape2) wide_legacy <- dcast(df, Group ~ Category, value.var = "Value") wide_legacy$Group <- as.numeric(gsub("G", "", wide_legacy$Group))
实操提示:如果原始长表中存在同一Group+Category组合的重复数值,可在
pivot_wider中通过values_fn = \(x) mean(x)这类参数指定聚合规则,避免函数抛出值不唯一的报错。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

