You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用R语言将表格中的N行数据转换为列(spread操作)

嘿,这个需求我天天在数据处理里碰到!用R来实现其实非常简单,核心就是把长格式数据转成宽格式,我给你用最常用的工具一步步演示~

首先先明确你的需求场景,我先模拟一组典型的输入输出示例:

示例输入(长格式):

类别年份数值
销售额2020100
销售额2021150
销售额2022200
利润202020
利润202130
利润202240

示例输出(宽格式,年份转成列):

类别202020212022
销售额100150200
利润203040

方法一:用tidyverse的tidyr包(推荐)

这是现在R数据处理的主流工具,语法清晰功能强大,和dplyr等包配合起来超顺手。

  1. 先构造示例输入数据(你可以替换成自己的表格):
input_df <- data.frame(
  类别 = c("销售额", "销售额", "销售额", "利润", "利润", "利润"),
  年份 = c(2020, 2021, 2022, 2020, 2021, 2022),
  数值 = c(100, 150, 200, 20, 30, 40)
)
  1. 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

火山引擎 最新活动