在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工具链就能搞定,步骤如下:
- 加载依赖包
library(tidyverse)
- 处理数据
# 提取第一行的年份,建立列名和年份的对应关系 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
相关产品推荐
相关产品推荐

