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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:20:37