2017-04-21 12 views
0

私は、データの一部が国名を削除しているプロジェクトに取り組んでいます。私の元のデータフレーム(命名NOAA)LOCATION_NAME列には、次のようになります。テキストの一致と置換R

ヘッド(NOAAます$ LOCATION_NAME、5)
[1] "JORDAN:BAB-A-ダルアー、AL-カラック"
[ 2] "シリア:ウガリット"
[3] "トルクメニスタン:W"
[4] "ギリシャ:THERA ISLAND(SANTORINI)"
[5] "ISRAEL:アリハ(JERICHO)"

私が使用している国名を削除するには:

NOAAの$のLOCATION_NAME < - GSUB 「アンタクヤ(:それはかなりうまく動作します( '^ *。+'、 ''、NOAAの$のLOCATION_NAME)

は、しかし、私はまだのようなエントリを取得しますANTIOCH); SYRIA " または " DIMASHQ;トルコ:ANTIOCH;レバノン:TARABULUS COUNTRYNAME」(表現がで始まっていないので、 『:』

で終わる何でも削除 『:CHINA:雲南省:ミドゥ『

:』 の場合には、オプションではありませんが』

I "は雲南省:ミドゥ" 保持したいため

を "パキスタン:INDUS DELTA;インド:SAMAWANI(SAMAJI)"

Iを保持したい "INDUS DELTAを、SAMAWANI(SAMAJI)"

私も同じようなインスタンスがあります"SWITZERLAND"(いいえ ":")、私はちょうど ""(スペース)を入れると思います。

私は自分のデータフレームに国名の列を持ち、固有の国名のベクトルを作ることができます。文字列の一部が私の国の列の国名と一致するかどうかを調べるスマートな方法があるかどうか疑問に思っていました。もしそうなら、それを削除することができます。

私はこれについていくつかの助けに感謝します。

+0

ちょうど逆のアルファベットで国の名前を並べ替えます。次に、すべての文字列を ''(?: ''+ join(' | '、array)+'') ''のように交互に結合します。次に境界構造を追加する必要があります。 – sln

答えて

0

これは正規表現またはパターンのリストを(|で区切って)作成します。 NOAA < - read.tableを(テキスト=」LOCATION_NAME
"JORDAN:BAB-A-ダルアー、AL-カラック" "シリア:ウガリット" "トルクメニスタン:W" "ギリシャ:THERA ISLAND(SANTORINI)" "イスラエル:アリハ(ジェリコ)" "SWITZERLAND 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] 
}) 
関連する問題