如何将含多值的宽格式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
相关产品推荐
相关产品推荐

