在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
相关产品推荐
相关产品推荐

