如何从 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 空格。
我有一个从 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 空格。