为字符向量分配数字编码:大小写不敏感匹配问题求助
解决大小写敏感的城市代码匹配问题
这问题其实就是R默认的字符串匹配是大小写敏感导致的,'Cityaa'和'CITYAA'会被当成完全不同的字符串,咱们只需要统一两边的大小写就能搞定!下面给你两种常用的解决方法:
方法1:Base R 快速匹配
先把你的矩阵转成数据框(操作起来更顺手),然后把Y的所有元素转成大写(或者小写,只要和X里的城市名格式统一就行),再用match()函数完成匹配:
# 构造你的原始数据 x1 <- c('CITYAA','CITYBB','CITYCC') x2 <- c(101,201,301) # 把矩阵转为数据框,方便后续操作 X <- data.frame(CityName = x1, CityCode = x2, stringsAsFactors = FALSE) Y <- c('Cityaa','Citybb','Cityaa','Citycc','Cityaa', 'Citybb') # 统一Y的大小写为大写,和X的城市名格式对齐 Y_upper <- toupper(Y) # 匹配并提取对应代码 Z <- X$CityCode[match(Y_upper, X$CityName)] # 查看结果 Z # 输出:[1] 101 201 101 301 101 201
方法2:用dplyr做直观的左连接
如果你习惯用tidyverse的风格,用left_join()会更清晰,尤其数据量较大的时候可读性更强:
library(dplyr) # 把Y转为数据框 Y_df <- data.frame(CityName = Y, stringsAsFactors = FALSE) # 统一大小写后左连接,提取代码 Z <- Y_df %>% mutate(CityName_normalized = toupper(CityName)) %>% left_join(X, by = c("CityName_normalized" = "CityName")) %>% pull(CityCode) # 查看结果 Z # 输出:[1] 101 201 101 301 101 201
关键思路总结
核心就是消除大小写差异:要么把Y转成和X一致的大写,要么把X的城市名转成小写,只要两边的字符串格式统一,匹配就会准确生效。如果你的数据里还有其他大小写混合的情况,这种归一化的方法也同样适用~
内容的提问来源于stack exchange,提问作者Janak
相关产品推荐
相关产品推荐

