R语言处理邮政编码:9位邮编格式转换代码未生效问题
问题原因及解决方法
你的代码为什么没改变变量a?
- 循环
for (i in a)中的i是a里元素的副本,修改i不会影响原向量a的内容 str_replace的计算结果没有被赋值回a的对应位置,相当于白算了一遍- 用
length(i)判断长度完全错误:不管是字符型还是数值型的单个邮编元素,length(i)都是1,根本无法区分5位和9位邮编,应该用nchar()获取字符长度(前提是邮编转成字符型)
正确的处理方式(推荐向量式操作,R的最优写法)
首先必须把邮编转成字符型(避免数值型丢失前导零,比如00123这种邮编):
df$Zip_Code <- as.character(df$Zip_Code)
然后用正则表达式批量替换,只处理9位邮编,5位的保持不变:
library(stringr) df$Zip_Code <- str_replace(df$Zip_Code, "^(\\d{5})(\\d{4})$", "\\1-\\2")
- 正则
^(\\d{5})(\\d{4})$匹配刚好9位数字的字符串,分成两组:前5位和后4位 - 替换为
\\1-\\2就是把两组用连字符连接
如果一定要用循环(不推荐,R中向量操作效率更高)
需要遍历向量的索引,直接修改原向量的元素:
library(stringr) a <- as.character(df$Zip_Code) for (i in seq_along(a)) { if (nchar(a[i]) == 9) { a[i] <- str_replace(a[i], "(\\d{5})", "\\1-") } } df$Zip_Code <- a
内容的提问来源于stack exchange,提问作者corinbog
相关产品推荐
相关产品推荐

