如何使用R语言将表格中的N行数据转换为列(spread操作)
嘿,这个需求我天天在数据处理里碰到!用R来实现其实非常简单,核心就是把长格式数据转成宽格式,我给你用最常用的工具一步步演示~
首先先明确你的需求场景,我先模拟一组典型的输入输出示例:
示例输入(长格式):
类别 年份 数值 销售额 2020 100 销售额 2021 150 销售额 2022 200 利润 2020 20 利润 2021 30 利润 2022 40
示例输出(宽格式,年份转成列):
类别 2020 2021 2022 销售额 100 150 200 利润 20 30 40
方法一:用tidyverse的tidyr包(推荐)
这是现在R数据处理的主流工具,语法清晰功能强大,和dplyr等包配合起来超顺手。
- 先构造示例输入数据(你可以替换成自己的表格):
input_df <- data.frame( 类别 = c("销售额", "销售额", "销售额", "利润", "利润", "利润"), 年份 = c(2020, 2021, 2022, 2020, 2021, 2022), 数值 = c(100, 150, 200, 20, 30, 40) )
- 用
pivot_wider函数完成转换:
# 先加载tidyverse包(包含tidyr) library(tidyverse) # 核心转换代码 output_df <- input_df %>% pivot_wider( id_cols = 类别, # 保持不变的行标识列(可以是多个,比如c(类别, 地区)) names_from = 年份, # 要转成列名的列(这里就是年份) values_from = 数值 # 填充新列的数值来源 ) # 查看结果 print(output_df)
如果你的数据里存在同一类别同一年份有多个数值的情况,还可以用values_fn参数做聚合处理:
# 比如对重复值取平均值,也可以用sum、max等 output_df <- input_df %>% pivot_wider( id_cols = 类别, names_from = 年份, values_from = 数值, values_fn = mean )
方法二:base R原生reshape函数(无需额外包)
如果你不想加载第三方包,base R的reshape也能搞定,就是语法稍微繁琐一点:
output_df_base <- reshape( input_df, idvar = "类别", # 行标识列 timevar = "年份", # 要转成列的变量 direction = "wide" # 指定转换方向为宽格式 ) # 去掉默认的列名前缀(比如"数值.") colnames(output_df_base) <- gsub("数值\\.", "", colnames(output_df_base)) print(output_df_base)
方法三:reshape2包的dcast函数
这是tidyr之前常用的工具,现在虽然不如tidyr流行,但也能轻松实现:
library(reshape2) output_df_dcast <- dcast(input_df, 类别 ~ 年份, value.var = "数值") print(output_df_dcast)
总的来说,优先推荐tidyr::pivot_wider,它的参数逻辑更直观,处理复杂场景的能力也更强,几乎能覆盖所有行转列的需求~
内容的提问来源于stack exchange,提问作者Kyle




