R语言面板数据框重构:合并带年份后缀的重复测量变量
R 批量合并带年份后缀面板变量方案
下面提供两种可直接复用的批量处理方案,均支持自动识别所有测量指标,无需手动逐个指定变量,适配15+指标、10个年份的处理需求:
Tidyverse 方案(语法简洁易维护)
利用tidyr的长宽表转换逻辑自动拆分变量名、匹配年份,适配任意符合「指标名_年份」命名规则的变量:
# 加载依赖包,未安装可先运行 install.packages("tidyverse") library(tidyverse) result <- y %>% # 除id、year外的所有列转长格式,拆分指标名和对应的变量年份 pivot_longer( cols = -c(id, year), names_to = c("indicator", "var_year"), names_sep = "_", names_transform = list(var_year = as.integer) ) %>% # 仅保留变量年份与当前行年份匹配的有效取值 filter(var_year == year) %>% # 转回宽格式得到合并后的单个指标列 pivot_wider( id_cols = c(id, year), names_from = indicator, values_from = value )
基础R 方案(无第三方包依赖,处理速度更快)
通过字符串匹配提取指标名,用矩阵索引批量取值,适合大数据量场景:
# 提取所有唯一的测量指标名(自动去重,无需手动录入) indicators <- unique(sub("_[0-9]{4}$", "", names(y)[!names(y) %in% c("id", "year")])) # 遍历每个指标,匹配对应年份的取值生成新列 for (ind in indicators) { target_col <- paste0(ind, "_", y$year) # 矩阵索引快速定位取值,效率远高于逐行遍历 y[[ind]] <- y[cbind(seq_len(nrow(y)), match(target_col, names(y)))] } # 仅保留需要的最终列 result <- y[, c("id", "year", indicators)]
两种方案运行后得到的result均与给出的预期输出结构完全一致。
内容的提问来源于stack exchange,提问作者R9413
相关产品推荐
相关产品推荐

