【问题标题】:Formatting UK Postcodes in R在 R 中格式化英国邮政编码
【发布时间】:2021-11-26 12:35:35
【问题描述】:

我正在尝试格式化作为 R 中不同输入向量的英国邮政编码。

例如,我有以下邮政编码:

postcodes<-c("IV41 8PW","IV408BU","kY11..4hJ","KY1.1UU","KY4    9RW","G32-7EJ")

如何编写将上述向量条目转换为的通用代码:

c("IV41 8PW","IV40 8BU","KY11 4HJ","KY1 1UU","KY4 9RW","G32 7EJ")

即邮政编码的第一部分与邮政编码的第二部分之间用一个空格隔开,所有字母都是大写。

编辑:邮政编码的第二部分始终是最后 3 个字符(数字后跟字母的组合)

【问题讨论】:

  • 一般来说这似乎很重要,但this answer 可能有用
  • @RonakShah - 第二部分总是 3 个字符。所以可以假设最后 3 个数字和字母构成第二部分。

标签: r string vector format postal-code


【解决方案1】:

我想不出一个聪明的正则表达式解决方案,所以这里是一个拆分-应用-组合的方法。

sapply(strsplit(sub('^(.*?)(...)$', '\\1:\\2', postcodes), ':', fixed = TRUE), function(x) {
  paste0(toupper(trimws(x, whitespace = '[.\\s-]')), collapse = ' ')
})

#[1] "IV41 8PW" "IV40 8BU" "KY11 4HJ" "KY1 1UU"  "KY4 9RW"  "G32 7EJ" 

这里的逻辑是我们在第一部分和第二部分之间的字符串中插入一个:(或任何不在数据中的字符)。拆分:上的字符串,去掉不必要的字符,取大写字母组合成一个字符串。

【讨论】:

  • 这是完美的,谢谢。我还可以问你 - 我如何调整代码以包含在第一个元素之前有空格的邮政编码的格式,即如何在你的解决方案中将“G48 1PG”变成“G48 1PG”?
  • trimws(postcodes) 应该删除这些空格。
【解决方案2】:

一种方法:

  1. 转为大写

  2. 提取字母数字字符

  3. 在最后三个字符之前用一个空格粘贴回去

代码将是:

library(stringr)

postcodes<-c("IV41 8PW","IV408BU","kY11..4hJ","KY1.1UU","KY4    9RW","G32-7EJ")

postcodes <- str_to_upper(postcodes)
sapply(str_extract_all(postcodes, "[:alnum:]"), function(x)paste(paste0(head(x,-3), collapse = ""), paste0(tail(x,3), collapse = "")))
# [1] "IV41 8PW" "IV40 8BU" "KY11 4HJ" "KY1 1UU"  "KY4 9RW"  "G32 7EJ"

【讨论】:

  • head/tail 结构非常好,尤其是head(x, -3)'[:alnum:]' 处理前导空格的边缘情况,如下所述。
【解决方案3】:

您可以删除所有不是单词字符 \\W(或 [^[:alnum:]_])的内容,然后在最后 3 个字符之前插入一个空格,其中包含 (.{3})$ \\1

sub("(.{3})$", " \\1", toupper(gsub("\\W+", "", postcodes)))
#sub("(...)$", " \\1", toupper(gsub("\\W+", "", postcodes))) #Alternative
#sub("(?=.{3}$)", " ", toupper(gsub("\\W+", "", postcodes)), perl=TRUE) #Alternative
#[1] "IV41 8PW" "IV40 8BU" "KY11 4HJ" "KY1 1UU"  "KY4 9RW"  "G32 7EJ" 

【讨论】:

  • 这是最好的解决方案 (+1)。
【解决方案4】:
# Option 1 using regex: 
res1 <- gsub(
  "(\\w+)(\\d[[:upper:]]\\w+$)", 
  "\\1 \\2",
  gsub(
    "\\W+",
    " ",
    postcodes
  )
)

# Option 2 using substrings:
res2 <- vapply(
  trimws(
    gsub(
      "\\W+",
      " ",
      postcodes
    )
  ),
  function(ir){
    paste(
      trimws(
        substr(
          ir, 
          1,
          nchar(ir) -3
        )
      ),
      substr(
        ir, 
        nchar(ir) -2,
        nchar(ir)
      )
    )
  },
  character(1),
  USE.NAMES = FALSE
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多