我试图在R中做一些数据整理与邮政编码,有些是5位数,其他是9,我想从XXXXXXXXX更改为XXXXX-XXXX。Df是包含这些邮政编码的数据帧,其中包含相同邮政编码的多个重复。
a <- df$Zip_Code
for (i in a){
if (length(i) > 5){
str_replace(i, '(d{5})','1-')
}}
代码运行找到,但值'a'没有改变,所以我想知道我做错了什么。
您可以使用以下方法在基数R或stringr
中完成此操作。您不需要for
循环或if
语句,因为R使用向量化:
zip <- c(12345, 12345, 123456789, 123456789)
substr
使用substr
将前5位数字与后4位数字分开,然后使用paste0
将它们重新组合在一起
zip[nchar(zip) > 5] <- paste0(substr(zip[nchar(zip) > 5], 1, 5),
"-",
substr(zip[nchar(zip) > 5], 5, 9))
# [1] "12345" "12345" "12345-56789" "12345-56789"
gsub
你也可以选择使用gsub
来使它更优雅:
zip[nchar(zip) > 5] <- gsub('^(.{5})(.*)$',
'\1-\2',
zip[nchar(zip) > 5])
# [1] "12345" "12345" "12345-6789" "12345-6789"
stringr
既然你标记了stringr
,这里是使用stringr::str_replace
的方法:
zip[nchar(zip) > 5] <- stringr::str_replace(zip[nchar(zip) > 5],
pattern = "(.{5})(.*)",
replacement = "\1-\2")
# [1] "12345" "12345" "12345-6789" "12345-6789"