R

时间:2017-04-21 00:02:59

标签: r regex replace

我正在开发一个项目,其中一部分清理数据正在删除国家/地区名称。我的原始数据框(名为noaa)LOCATION_NAME列如下所示:

  

头(NOAA $ LOCATION_NAME,5)
  [1]" JORDAN:BAB-A-DARAA,AL-KARAK"
  [2]"叙利亚:UGARIT"
  [3]"土耳其人:W"
  [4]"希腊:THERA ISLAND(SANTORINI)"
  [5]"以色列:ARIHA(JERICHO)"

要删除我使用的国家/地区名称:

  

noaa $ LOCATION_NAME< - gsub(' ^。*:+','',noaa $ LOCATION_NAME)

它工作得很好,但是,我仍然得到如下条目: " ANTAKYA(ANTIOCH);叙利亚" 要么 " DIMASHQ;土耳其:ANTIOCH;黎巴嫩:的黎波里" (因为表达式并非以" countryname:"

开头

删除任何以"结尾的内容:"在以下情况下不是一种选择: "中国:云南省:MIDU"

我想保留"云南省:MIDU"

&p;巴基斯坦:印度三角洲;印度:SAMAWANI(SAMAJI)"

我想保留" INDUS DELTA; SAMAWANI(SAMAJI)"

我也有像"瑞士" (不是":"),我猜我会把#&34; " (空间)。

我的数据框中有一个包含国家/地区名称的列,我可以创建一个包含唯一国家/地区名称的向量。我想知道是否有一种智能方法来检查字符串的一部分是否与我的国家/地区列中的国家/地区名称相匹配,如果是,那么我可以删除它。

我很感激你的帮助。

2 个答案:

答案 0 :(得分:1)

由于国家/地区字符串可能位于字符串的不同部分,因此您可以使用“;”对其进行分区然后“:”首先匹配您唯一的国家/地区名称:

#dfOfCountries is the data.frame containing all the countries as mentioned in your qn
distinctcountries <- unique(dfOfCountries$COUNTRY)

noaa$COUNTRY <- sapply(noaa$LOCATION_NAME, function(x) {
    strparts <- trimws(unlist(lapply(strsplit(x, ":")[[1]], strsplit, split=";")))
    strparts[strparts %in% distinctcountries]
})

答案 1 :(得分:0)

这使得正则表达式或模式列表(由|分隔)。    noaa&lt; - read.table(text =&#39;     LOCATION_NAME
    &#34; JORDAN:BAB-A-DARAA,AL-KARAK&#34;     &#34;叙利亚:UGARIT&#34;     &#34;土库曼斯坦:W&#34;     &#34;希腊:THERA ISLAND(SANTORINI)&#34;     &#34;以色列:ARIHA(JERICHO)&#34;     &#34;瑞士SOMEWHERE&#34;     &#39;,header = TRUE,stringsAsFactors = FALSE)

countries <- c("JORDAN", "SYRIA", "GREECE", "SWITZERLAND")

# build an or list of patterns including country name ending with
# either (in priority order) <space>: or : or <space>
patterns <- paste0(countries, collapse="(\\s\\:|\\:|\\s)|")
trimws(gsub(patterns, "", noaa$LOCATION_NAME))

# [1] "BAB-A-DARAA,AL-KARAK"     "UGARIT"                   "TURKMENISTAN: W"          "THERA ISLAND (SANTORINI)"
# [5] "ISRAEL: ARIHA (JERICHO)"  "SOMEWHERE"