如何用base R规范转置重塑1行31列的年度收入数据框?
宽表转长表的规范实现(Base R优先)
Base R 推荐方案
1. 用stack()快速转换(最简洁)
stack()是Base R中专门用于宽转长的工具,直接提取列名作为年份,列值作为收入数据,后续只需处理数值转换和列名调整:
# 转换为长格式 long_df <- stack(china_income_30) # 重命名列 colnames(long_df) <- c("income_str", "year") # 处理带"k"的数值转换(将k替换为科学计数法e3) long_df$China <- as.numeric(gsub("k", "e3", long_df$income_str)) # 保留需要的列 long_df <- long_df[, c("China", "year")] # 查看结果 head(long_df)
输出:
China year 1 1420 1990 2 1540 1991 3 1730 1992 4 1950 1993 5 2180 1994 6 2390 1995
2. 用reshape()通用重塑(适合复杂场景)
如果需要更灵活的参数控制,reshape()是Base R的通用数据重塑函数:
long_df <- reshape(china_income_30, direction = "long", # 指定转为长格式 varying = colnames(china_income_30), # 要转换的列 v.names = "income_str", # 数值列的名称 timevar = "year", # 年份列的名称 times = colnames(china_income_30), # 年份取值 idvar = NULL) # 不需要ID列 # 处理数值转换并调整列顺序 long_df$China <- as.numeric(gsub("k", "e3", long_df$income_str)) long_df <- long_df[, c("China", "year")] row.names(long_df) <- NULL # 重置行名 head(long_df)
对比原转置方法的优势
原方法使用t()转置后会生成带默认列名(如X33)的结果,需要手动修改列名,且转置后行名作为年份,后续还要单独提取;而stack()/reshape()直接生成结构规范的长表,无需额外处理行名/列名的冗余操作,代码更清晰、易维护。
dplyr + tidyr 可选方案
如果习惯tidyverse生态,pivot_longer()的语法更直观:
library(tidyr) library(dplyr) long_df <- china_income_30 %>% pivot_longer(cols = everything(), # 转换所有列 names_to = "year", # 列名转为year列 values_to = "income_str") %>% # 列值转为income_str列 mutate(China = as.numeric(gsub("k", "e3", income_str))) %>% # 数值转换 select(China, year) # 保留需要的列 head(long_df)
内容的提问来源于stack exchange,提问作者Geosphere
相关产品推荐
相关产品推荐

