R语言批量替换州编码为州名及后续数据处理问题求助
批量替换美国州编码为州名的R语言解决方案
问题背景
我有一列名为STATE CODE的字段,取值为01、02直至53、54、55、56、72等州编码,希望将这些编码批量替换为对应州名,不想逐个使用mutate函数实现。数据集已按州编码排序,州编码与州名的对应关系见数据字典。
当前数据集示例:
ST 01 01 01 02 02 04
期望效果:
ST Alabama Alabama Alabama Alaska Alaska Arizona
数据字典文本如下:
ST State Code 01 .Alabama/AL 02 .Alaska/AK ...(省略其余内容) 72 .Puerto Rico/PR
编辑内容
使用@akrun的代码将州字典文本导入R并转为data.frame,但出现表头错误(Alabama被设为表头),需要修正为如下格式:
State Code State Name 1 Alabama 2 Alaska
同时希望去除州名中斜杠(/)后的内容,例如将Alaska/AK改为Alaska。
编辑2内容
我组合代码实现了部分需求,代码如下:
df <- structure(list(`state code` = c("01", "02", "04", "05", "06", "08", "09", "10", "11", "12", "13", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "44", "45", "46", "47", "48", "49", "50", "51", "53", "54", "55", "56", "72"), state = c("Alabama/AL", "Alaska/AK", "Arizona/AZ", "Arkansas/AR", "California/CA", "Colorado/CO", "Connecticut/CT", "Delaware/DE", "District of Columbia/DC", "Florida/FL", "Georgia/GA", "Hawaii/HI", "Idaho/ID", "Illinois/IL", "Indiana/IN", "Iowa/IA", "Kansas/KS", "Kentucky/KY", "Louisiana/LA", "Maine/ME", "Maryland/MD", "Massachusetts/MA", "Michigan/MI", "Minnesota/MN", "Mississippi/MS", "Missouri/MO", "Montana/MT", "Nebraska/NE", "Nevada/NV", "New Hampshire/NH", "New Jersey/NJ", "New Mexico/NM", "New York/NY", "North Carolina/NC", "North Dakota/ND", "Ohio/OH", "Oklahoma/OK", "Oregon/OR", "Pennsylvania/PA", "Rhode Island/RI", "South Carolina/SC", "South Dakota/SD", "Tennessee/TN", "Texas/TX", "Utah/UT", "Vermont/VT", "Virginia/VA", "Washington/WA", "West Virginia/WV", "Wisconsin/WI", "Wyoming/WY", "Puerto Rico/PR")), row.names = c(NA, -52L), class = "data.frame") st <- structure(list(ST = c("01", "02", "04", "05", "06","08", "09", "10", "11", "12", "13", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "44", "45", "46", "47", "48", "49", "50", "51", "53", "54", "55", "56", "72")), row.names = c(NA,-52L), class = "data.frame") df2 <- data.frame(ST = gsub("/.*|\\\\W", "", lapply(st$ST, function(x) df[x == df$'state code',2]))) st$df2 <- df2 st names(st) <- c("State Code", "State Names")
运行代码后,新增列的列名仍带有$ST,使用names(st) <- c("State Code", "State Names")无法修改,请求解决该问题及之前的相关需求。
解决方案
1. 修正字典数据格式并清理州名
先处理字典数据df,剥离州名中斜杠后的部分,确保结构符合要求:
# 清理州名,仅保留斜杠前的内容 df$clean_state <- gsub("/.*", "", df$state) # 重新整理字典,设置标准列名 state_dict <- df[, c("state code", "clean_state")] names(state_dict) <- c("State Code", "State Name")
2. 批量替换主数据集的州编码
用merge或dplyr::left_join实现批量匹配,这是最简洁高效的方式,无需循环:
# Base R 实现 result <- merge(st, state_dict, by.x = "ST", by.y = "State Code", all.x = TRUE) # 调整列名和结构 result <- result[, c("State Name")] names(result) <- "ST" # dplyr 更直观的实现 library(dplyr) result <- st %>% left_join(state_dict, by = c("ST" = "State Code")) %>% select(ST = `State Name`)
3. 修复原代码的列名异常问题
你之前的代码将data.frame直接嵌套进st,导致列结构异常。正确做法是提取向量后添加:
# 提取匹配后的州名向量 df2 <- sapply(st$ST, function(x) { gsub("/.*", "", df[df$`state code` == x, "state"]) }) # 添加为普通列,而非嵌套data.frame st$`State Names` <- df2 # 重命名原列 names(st)[1] <- "State Code"
处理后数据集将完全符合预期格式,同时完成批量替换。
内容的提问来源于stack exchange,提问作者Annie
相关产品推荐
相关产品推荐

