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

基于键值对重命名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"))

问题原因

  1. 名称拼接顺序错误:函数中把代码和年份的顺序搞反了,需求是前缀_年份,但代码里拼成了代码_年份。
  2. 字符串提取可靠性不足:依赖substr固定位置提取代码,若变量名格式有变化会失效。
  3. 字典映射未正确使用:没有通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:14:53