首页 > 解决方案 > 删除 R 数据框中的值中的模式

问题描述

在下面的数据框中,我想删除以下内容:

  1. “ 和 ”
  2. “和”
  3. “,美联储。Sts。”
  4. “, 共和国”
  5. “大不列颠及北爱尔兰”
    d <- data.frame(LOCATION = c("Antigua and Barbuda", 
                                 "Bosnia and Herzegovina",
                                 "Central Europe and the Baltics",
                                 "Micronesia, Fed. Sts.",
                                 "South Sudan, Republic of",
                                 "United Kingdom of Great Britain and Northern Ireland"))

我会使用直接将“Antigua and Barbuda”更改为“AntiguaBarbuda”

d$LOCATION[d$LOCATION == "Antigua and Barbuda"] <- "AntiguaBarbuda"

但是我有一个包含许多不同值的大型数据集,这些值展示了这些模式,并且我希望能够在可能的情况下一步从变量中的所有值中删除这些模式,而不是根据具体情况逐个删除。

提前谢谢了!

标签: rdata-cleaning

解决方案


d从问题中使用,gsub如图所示:

pats <- c(" and ", " and the ", ", Fed. Sts.", ", Republic of", 
  " of Great Britain and Northern Ireland")
pat <- paste(pats, collapse = "|")  # combine into single pattern
transform(d, LOCATION = gsub(pat, "", LOCATION))

给予:

               LOCATION
1        AntiguaBarbuda
2     BosniaHerzegovina
3 Central EuropeBaltics
4            Micronesia
5           South Sudan
6        United Kingdom

命令

请注意,我们没有要匹配的字符串重新排序。事实上,只要使用默认的 R 正则表达式引擎,对要匹配的字符串进行重新排序是没有意义的。我们将在本节的其余部分对此进行解释。

您可能会认为(或者至少我是这么认为的)正则表达式急切地工作,因此即使较长的匹配后面跟着较短的匹配作为前缀,它也会在一系列替代方案中采用最左边的匹配,但事实证明那是在 R 中并非如此。这有时被称为正则表达式导向与文本导向正则表达式,似乎 R 中的默认正则表达式引擎是文本导向的。例如,ab即使严格的从左到右的急切匹配过程将被删除,下面也会被删除a,因此ab不匹配。

gsub("a|ab", "", "xabcy") # text oriented
## [1] "xcy"

但是,如果我们使用 perl 引擎,那么它是正则表达式导向的,并且会进行从左到右的急切匹配。

gsub("a|ab", "", "xabcy", perl = TRUE) # regex oriented
## [1] "xbcy"

推荐阅读