如何用R将面板数据转换为按年份排列的单ID单行格式?
长格式面板数据转宽格式解决方案
推荐方法:使用tidyr::pivot_wider()
spread()仅支持单值列转换,无法处理你的多变量场景,改用pivot_wider()可以一次性完成所有变量的宽格式转换,代码如下:
library(tidyr) library(dplyr) # 假设数据包含id(个体标识)、year(年份)及其他20个特征列 data_ex_new <- data_ex_old %>% pivot_wider( id_cols = id, # 按ID分组,每个ID对应一行 names_from = year, # 用年份作为列名后缀 values_from = -c(id, year), # 转换所有非ID、非年份的列 names_glue = "{.value}_{year}" # 生成「变量名_年份」的列名格式 ) %>% arrange(id) # 按ID排序(可选)
大数据量优化方案:data.table::dcast()
你的数据有37万行,data.table的运算效率更高,适合大规模数据处理:
library(data.table) setDT(data_ex_old) # 提取所有需要转换的特征列名 feature_cols <- setdiff(names(data_ex_old), c("id", "year")) # 构建dcast公式 cast_formula <- as.formula(paste0("id ~ year")) data_ex_new <- dcast(data_ex_old, cast_formula, value.var = feature_cols, sep = "_")
原spread()失败原因
spread()是tidyr的旧版函数,仅支持单一值列的宽格式转换,当你有20个变量列时,需要逐个列调用spread,操作繁琐且容易出错,pivot_wider()是官方推荐的替代工具,原生支持多列转换。
内容的提问来源于stack exchange,提问作者Mangus
相关产品推荐
相关产品推荐

