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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:55:28