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

在R中对含多值的DataFrame透视:将年份设为列、变量各成列

解决方案

要实现将原始DataFrame转换为年份单独列、每个变量为一列的结构,需要结合pivot_longer和pivot_wider函数,核心是先拆分列名中的变量与年份信息,再重新构造宽表。

完整代码

# 加载tidyverse工具包(包含dplyr和tidyr)
library(tidyverse)

# 原始数据构造(你的代码)
name <- c("James", "Ron", "Eli", "Emily")
A_2021 <- c(10, 15, 100, 20)
A_2022 <- c(30, 40, 8, 10)
B_2021 <- c(5, 5, 8, 7)
B_2022 <- c(17, 8, 9, 10)
C_2021 <- c(9, 9, 30, 18)
C_2022 <- c(100, 12, 4, 8)
D_2021 <- c(15, 18, 19, 20)
D_2022 <- c(20, 18, 19, 21)

df <- data.frame(name = name, A_2021 = A_2021, A_2022 = A_2022, B_2021 = B_2021, B_2022 = B_2022, C_2021 = C_2021, C_2022 = C_2022, D_2021 = D_2021, D_2022 = D_2022)

# 数据转换
df_transformed <- df %>%
  # 第一步:将宽表转长表,拆分列名为变量和年份
  pivot_longer(
    cols = -name,  # 排除name列,处理所有值列
    names_to = c("variable", "year"),  # 拆分后的两个列名
    names_sep = "_",  # 按下划线拆分列名
    values_to = "value"  # 存储原始值的列名
  ) %>%
  # 第二步:将长表转回宽表,以变量为列名
  pivot_wider(
    names_from = variable,  # 将variable列的取值作为新列名
    values_from = value  # 对应的值填充到新列中
  ) %>%
  # 按姓名和年份排序,与期望输出一致
  arrange(name, year)

# 查看结果
print(df_transformed)

转换结果

# A tibble: 8 × 6
  name  year      A     B     C     D
  <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 James 2021     10     5     9    15
2 James 2022     30    17   100    20
3 Ron   2021     15     5     9    18
4 Ron   2022     40     8    12    18
5 Eli   2021    100     8    30    19
6 Eli   2022      8     9     4    19
7 Emily 2021     20     7    18    20
8 Emily 2022     10    10     8    21

补充说明

  • 如果不需要单独的year列,可在代码末尾添加%>% select(-year),即可得到你给出的无年份列的期望结构。
  • 单独使用pivot_longer只能得到长格式数据,需要配合pivot_wider才能将变量重新转为列,这是之前尝试未成功的核心原因。

内容的提问来源于stack exchange,提问作者Ramzi Saud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:15:01