基于键值对重命名R语言数据框变量的技术求助
问题:BEA CAINC4数据变量重命名失败解决方法
我使用BEA的CAINC4公开就业数据,对数据重塑后用于计算就业率,但变量命名混乱。尝试编写函数基于键值对重命名变量,希望将x1969_10这类变量名改为inc_1969(对应规则:10→inc,20→pop,7010→emp,7020→wemp),但函数执行后变量名无任何变化。相关数据结构及尝试的代码如下:
数据结构与初始代码
library(ggplot2) library(usmap) library(readr) library(dplyr) library(stringr) library(reshape2) library(tidyr) library(shiny) library(cowplot) library(plotly) inc_rr = structure(list(fips = c("01001", "01003", "01005", "01007", "01009", "01011"), geoname = c("Autauga, AL", "Baldwin, AL", "Barbour, AL", "Bibb, AL", "Blount, AL", "Bullock, AL"), region = c(5L, 5L, 5L, 5L, 5L, 5L), tablename = c("CAINC4", "CAINC4", "CAINC4", "CAINC4", "CAINC4", "CAINC4"), x1969_10 = c(69973, 157191, 51130, 29810, 69322, 22716), x1969_20 = c(25166, 56951, 23818, 14994, 26411, 12554), x1969_7010 = c(6630, 20008, 9428, 4087, 7660, 4370), x1969_7020 = c(5457, 14886, 7149, 3344, 4839, 3431), x1970_10 = c(77712, 172745, 57657, 32551, 70070, 25439), x1970_20 = c(24606, 59474, 22655, 13798, 26999, 11749), x1970_7010 = c(6853, 19749, 9448, 3965, 7587, 4281), x1970_7020 = c(5650, 14713, 7323, 3259, 4891, 3360)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" )) # 代码映射字典(第二个覆盖了第一个,实际应保留第二个) codes <- list( inc = 10, pop = 20, emp = 7010, wemp = 7020 ) codes <- list( "10" = "inc", "20" = "pop", "7010" = "emp", "7020" = "wemp" ) # 尝试编写的重命名函数 rename_vars <- function(var_name) { var_name <- sub("^x", "", var_name) # 移除x前缀 year <- substr(var_name, 1, 4) # 提取年份 type <- substr(var_name, start = 6, stop = nchar(var_name)) # 提取代码 if (type %in% names(codes)) { new_name = paste0(type, year, sep = "_") return(new_name) } else { return(var_name) } } test <- inc_rr %>% rename_with(rename_vars, starts_with("x"))
问题原因
- 名称拼接顺序错误:函数中把代码和年份的顺序搞反了,需求是
前缀_年份,但代码里拼成了代码_年份。 - 字符串提取可靠性不足:依赖
substr固定位置提取代码,若变量名格式有变化会失效。 - 字典映射未正确使用:没有通过
codes[type]获取对应的目标前缀,直接使用了原代码值。
修正后的解决方案
1. 确定正确的映射字典
保留以代码为键、目标前缀为值的字典:
codes <- list( "10" = "inc", "20" = "pop", "7010" = "emp", "7020" = "wemp" )
2. 修正重命名函数
使用str_split按下划线拆分变量名,更可靠地提取年份和代码,然后正确拼接新名称:
rename_vars <- function(var_name) { # 移除开头的x前缀 var_clean <- sub("^x", "", var_name) # 按下划线拆分成年份和代码两部分 parts <- str_split(var_clean, "_", simplify = TRUE) year <- parts[1] type <- parts[2] # 匹配映射规则生成新名称;不匹配则保留原变量名 if (type %in% names(codes)) { paste0(codes[[type]], "_", year) } else { var_name } }
3. 执行重命名
test <- inc_rr %>% rename_with(rename_vars, starts_with("x"))
执行后,x1969_10会被改为inc_1969,x1969_7010改为emp_1969,完全符合需求。
内容的提问来源于stack exchange,提问作者Daniel Moore
相关产品推荐
相关产品推荐

