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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:57:08