如何高效为R语言dataframe批量添加缺失变量?
批量补充R数据框中缺失的前缀-年份变量
现有R数据框raw_data_2,变量命名规则为「前缀_年份」(比如a_2022、b_2023),但部分年份下的前缀变量缺失,需要批量补充这些缺失变量(值为NA)生成raw_data_2_fixed,无需手动逐个添加变量,以下是高效实现方案。
原始数据
library(tidyverse) raw_data_2 <- data.frame(category=c('A','B','C'), a_2022=c(1,2,3), b_2022=c(0.1,0.4,0.3), a_2023=c(1.5,3,4), e_2023=c(0.3,0.7,0.5) )
期望输出
raw_data_2_fixed <- data.frame(category=c('A','B','C'), a_2022=c(1,2,3), b_2022=c(0.1,0.4,0.3), e_2022=c(NA,NA,NA), a_2023=c(1.5,3,4), b_2023=c(NA,NA,NA), e_2023=c(0.3,0.7,0.5) )
高效实现代码
利用tidyverse的pivot_longer、complete和pivot_wider函数自动补全所有缺失的变量组合,无需手动指定变量名:
raw_data_2_fixed <- raw_data_2 %>% # 将宽表转长表,拆分变量名为前缀和年份 pivot_longer( cols = -category, names_to = c("prefix", "year"), names_sep = "_", values_to = "value" ) %>% # 补全所有前缀与年份的组合,按category分组保留原有数据 complete(prefix, year, nesting(category)) %>% # 转回宽表,恢复「前缀_年份」的变量命名格式 pivot_wider( names_from = c(prefix, year), values_from = value, names_sep = "_" ) %>% # 按年份和前缀排序列(可选,让列顺序与示例一致) select(category, matches("_2022"), matches("_2023"))
代码说明
- 转长表:把除
category外的列转换为长格式,拆分变量名得到前缀(a、b、e)和年份(2022、2023)。 - 补全组合:自动生成所有前缀与年份的可能组合,缺失的组合对应值填充为NA。
- 转回宽表:将长表还原为宽表,自动生成所有缺失的变量列。
- 列排序:可选步骤,让列按年份分组排列,和示例输出的列顺序一致。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

