2017-04-21 78 views
0

我正在開發一個項目,其中一部分清理數據剝離了國家/地區名稱。我的原始數據幀(名爲NOAA)LOCATION_NAME列是這樣的:R中的文本匹配和替換

頭(NOAA $ LOCATION_NAME,5)
[1] 「喬丹:BAB-A-德拉,AL-卡拉克」
[ 2] 「敘利亞:烏加里特」
[3] 「土庫曼斯坦:W」
[4] 「GREECE:THERA ISLAND(SANTORINI)」
[5] 「以色列:埃裏哈(JERICHO)」

刪除我正在使用的國家/地區名稱:

NOAA $ LOCATION_NAME < - GSUB( '^ *:+', '',諾阿$ LOCATION_NAME)

它工作得很好,不過,我還是得到這樣的條目: 「安塔基亞( ANTIOCH); SYRIA「 或 」DIMASHQ;土耳其:ANTIOCH;黎巴嫩:的黎波里COUNTRYNAME」(因爲表達不首先‘:’

消除任何一個結局‘:’是不是一種選擇,在以下情況下: ‘中國:雲南:彌渡’

我想保留 「雲南:彌渡」

爲 「巴基斯坦:印度河三角洲;印度:SAMAWANI(SAMAJI)」

我想保留 「印度河三角洲; SAMAWANI(SAMAJI)」

我也有像像「瑞士」(不是「:」),我想我會把它放在「」(空間)。

我在我的數據框中有一個國家名稱列,我可以製作一個具有獨特國家名稱的矢量。我想知道是否有一個聰明的方法來檢查字符串的一部分是否與我的國家/地區列中的國家/地區名稱匹配,如果是,則可以將其刪除。

我將不勝感激這方面的一些幫助。

+0

通過反向的字母的國家名稱只是排序。然後將所有字符串加入到一個交替中,像''(?:''+ join('|',array)+'')''然後你必須添加邊界結構。 – sln

回答

0

這使得模式的正則表達式或列表(由|分隔)。 NOAA < - 函數read.table(文本=」 LOCATION_NAME
「喬丹:BAB-A-德拉,AL-卡拉克」 「敘利亞:烏加里特」 「土庫曼斯坦:W」 「GREECE:THERA ISLAND(SANTORINI)」 「以色列:埃裏哈(JERICHO)」 「瑞士SOMEWHERE」 」,標題= 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"    
+0

這工作得很好,謝謝!我修改了正則表達式以包含「;」它正在做它應該做的事情。 – Julia

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] 
})