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

如何将含多值的宽格式DataFrame转置为长格式?

解决宽格式数据转置为指定长格式的问题

你的需求是将以VariableName为行、年份为列的宽格式数据,转换为以年份为行、各变量为列的格式。之前用的gather()/pivot_longer()/melt()只是完成了宽转长的第一步,需要结合后续重塑操作才能得到目标格式,以下提供两种可行方案:

方案一:使用tidyverse工具链(dplyr + tidyr)

library(tidyverse)

# 第一步:将年份列转为长格式,保留变量名和对应值
long_data <- wide %>%
  pivot_longer(
    cols = starts_with("Year"),  # 选择所有以Year开头的列
    names_to = "VariableName",   # 新列名存年份
    values_to = "Value"          # 对应的值
  )

# 第二步:将变量名转为列,年份作为行
final_result <- long_data %>%
  pivot_wider(
    names_from = VariableName,   # 用原VariableName的内容作为新列名
    values_from = Value          # 填充对应的值
  ) %>%
  # 调整列顺序,把年份列放在第一位并命名为VariableName
  relocate(VariableName, .before = everything())

# 查看结果
print(final_result)

方案二:使用Base R原生函数

# 转置除VariableName外的所有列
transposed_data <- t(wide[, -1])
# 设置新数据框的列名为原VariableName的取值
colnames(transposed_data) <- wide$VariableName
# 转换为数据框并整理格式
final_result_base <- as.data.frame(transposed_data) %>%
  # 添加年份列,用转置后的行名填充
  mutate(VariableName = rownames(.)) %>%
  # 将年份列移到第一位
  relocate(VariableName) %>%
  # 清除默认行名
  `rownames<-`(NULL)

# 查看结果
print(final_result_base)

两种方案运行后都会得到你需要的输出格式:

VariableName Var1 Var2 Var3 Var4 Var5
1        Year1  411  723  325  456  579
2        Year2  123  300  400  500  600
3        Year3 1457 1000  569  896  956

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:58:15