【问题标题】:text match and replacement in RR中的文本匹配和替换
【发布时间】:2017-04-21 00:02:58
【问题描述】:

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

头(noaa$LOCATION_NAME,5)
[1] “约旦:BAB-A-DARAA,AL-KARAK”
[2] “叙利亚:乌加里特”
[3] “土库曼斯坦:W”
[4] “希腊:瑟拉岛(圣托里尼)”
[5]《以色列:阿里哈(耶利哥)》

去除我正在使用的国家/地区名称:

noaa$LOCATION_NAME

它工作得很好,但是,我仍然得到如下条目: “安塔基亚(ANTIOCH);叙利亚” 或者 "DIMASHQ; TURKEY:ANTIOCH; LEBANON:TARABULUS"(因为表达式不以 "countryname:" 开头

在以下情况下,不能删除以“:”结尾的任何内容: "中国:云南省:弥渡"

我想保留“云南省:米都”

对于“巴基斯坦:印度三角洲;印度:SAMAWANI (SAMAJI)”

我想保留“INDUS DELTA; SAMAWANI (SAMAJI)”

我也有像“SWITZERLAND”(没有“:”)这样的实例,我想我会只放“”(空格)。

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

我将不胜感激。

【问题讨论】:

  • 只需按反向字母对国家名称进行排序。然后将所有字符串连接成一个交替,例如'(?:' + join('|', array) + ')' 然后你必须添加边界构造。

标签: r regex replace


【解决方案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]
})

【讨论】:

    【解决方案2】:

    这会生成一个正则表达式或模式列表(由 | 分隔)。 noaa “约旦:BAB-A-DARAA,AL-KARAK” “叙利亚:乌加里特” “土库曼斯坦:W” “希腊:瑟拉岛(圣托里尼)” “以色列:阿里哈(杰里科)” “瑞士某处” ', 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"               
    

    【讨论】:

    • 这很好用,谢谢!我修改了正则表达式以包含“;”它正在做它应该做的事情。
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多