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

在R中如何将首行存年份的数据集转换为长格式

R数据重塑:把首行存年份的宽格式转成带年份列的长格式

原始数据结构

df <- tibble(
  ID = c(NA, 1,2,3,4),
  Region = c(NA, "Region A", "Region B", "Region C", "Region D"), 
  Variable1 = c(2017, 1, 2, 3, 4),
  Variable1.1 = c(2018, 5, 6, 7, 8),
  Variable1.2 = c(2019, 9, 10, 11, 12),
  Variable2 = c(2019, 13, 14, 15, 16),
  Variable2.1 = c(2020, 17, 18, 19, 20)
)

目标数据结构

tibble(
  ID = c(1,1,1,1,2,2),
  Region = c("Region A","Region A","Region A","Region A", "Region B","Region B"), 
  Year = c(2017, 2018, 2019, 2020,2017,2018),
  Variable1 = c(1,5,9,NA,2,6),
  Variable2 = c(NA,NA,13,17,NA,NA)
)

解决方案代码

用tidyverse工具链就能搞定,步骤如下:

  1. 加载依赖包
library(tidyverse)
  1. 处理数据
# 提取第一行的年份,建立列名和年份的对应关系
year_mapping <- df %>% 
  slice(1) %>% 
  select(-ID, -Region) %>% 
  enframe(name = "col_name", value = "Year")

# 移除第一行,整理基础数据
main_data <- df %>% 
  slice(-1) %>% 
  mutate(ID = as.integer(ID))

# 重塑数据到目标格式
long_data <- main_data %>%
  # 先把所有变量列转成长格式
  pivot_longer(cols = starts_with("Variable"), names_to = "col_name", values_to = "value") %>%
  # 关联年份信息
  left_join(year_mapping, by = "col_name") %>%
  # 从列名里提取原始变量名(去掉.后面的序号)
  mutate(Variable = str_remove(col_name, "\\..*$")) %>%
  # 转成宽格式,每个变量占一列
  pivot_wider(id_cols = c(ID, Region, Year), names_from = Variable, values_from = "value") %>%
  # 补全所有年份,缺失值填充NA
  complete(ID, Region, Year = unique(Year)) %>%
  # 按ID和年份排序
  arrange(ID, Year)

运行后long_data就是你要的目标结构。

关键步骤说明

  • 先把第一行的年份提取出来,给每个变量列匹配对应的年份
  • 先转长再转宽,解决变量和年份绑定的问题
  • 用complete补全所有存在的年份,保证每个地区和ID都有完整的年份序列,没有数据的地方自动填NA

内容的提问来源于stack exchange,提问作者user21581187

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:10:23