如何从 R 中的国家/地区名称列表中删除多余的空格、特殊字符和不需要的文本?

How can I remove extra spaces, special characters, and unwanted text from a list of country names in R?

我有一个从 table 中提取的列表,目的是清理数据,然后将其作为新的干净列添加回来。该列最初包括带有一些特殊字符(“*”)的国家/地区名称和代码。到目前为止,我已经使用这段代码来删除括号中的代码和特殊字符(这可能不是最简单的方法),但是最后一行没有删除空格:

> dput(head(country.names, 10))
c(" United States (USA)", " China (CHN)", " Japan (JPN)*", " Great Britain (GBR)", 
" ROC (ROC)", " Australia (AUS)", " Netherlands (NED)", " France (FRA)", 
" Germany (GER)", " Italy (ITA)")

到目前为止,我已经使用此代码删除括号中的代码和特殊字符(这可能不是最简单的方法),但是最后一行没有删除空格:

> name <- gsub("\([^\)]*\)", "", country.names) %>% 
+   gsub("\*", "", .) %>%
+   gsub("^[[:space:]]+|$[[space:]]+", "", .)

(我还尝试了 gsub("^ | $", "", .) 和 trimws(name, which = "both") 来删除空格,但没有成功)

这是我使用这段代码的输出示例:

 [1]" United States "  " China " " Japan " " Great Britain " " ROC " " Australia " " Netherlands "       
 [8] " France " " Germany " " Italy " " Canada " " Brazil " " New Zealand " " Cuba "

您输入的 Unicode 空白字符一定是遇到了问题。

您可以使用

trimws(gsub("\([^()]*\)|[^[:alpha:][:space:]]", "", country.names))
# => [1] "United States" "China"         "Japan"     
#    [4] "Great Britain" "ROC"           "Australia"   
#    [7] "Netherlands"   "France"        "Germany"       "Italy"        

正则表达式匹配

  • \([^()]*\) - 最接近的括号之间的任何子字符串
  • | - 或
  • [^[:alpha:][:space:]] - 除了字母或空格之外的任何字符(这不是完全 Unicode 识别的,这就是为什么它也删除所有不寻常的空格)。

因此只保留常规的 ASCII 空格,trimws 没有任何附加参数也能正常工作。

如果国家/地区名称可以包含重音字母,您将必须使用 PCRE Unicode 识别正则表达式:

trimws(gsub("(*UCP)\([^()]*\)|[^\p{L}\s]", "", country.names, perl=TRUE), whitespace="[\p{Z}\t]")

此处,[^\p{L}\s](带有 (*UCP) PCRE 标志)匹配除 Unicode 字母或空格之外的任何字符,[\p{Z}\t] 匹配任何 Unicode 空格。