Rパッケージの "countrycode"には、 "country.name.en.regex"という変数も含まれているデータフレーム(countrycode_data)が含まれています。この変数には、国名またはそのバリエーションが特定の列にあるかどうかによって、TRUEまたはFALSEの新しい列を作成するために使用したい正規表現パターンが含まれています(下の例を参照)。パッケージの国コードと正規表現
AB <- c('CHINAS PARTY CONGRESS','JAPAN-US RELATIONS','JAPAN TRIES TO')
TI <- c('AMERICAN FOREIGN POLICY', 'CHINESE ATTEMPTS TO', 'BRITAIN HAS TEA')
AU <- c('AUTHOR 1', 'AUTHOR 2','AUTHOR 3')
M <- data.frame(AB,TI,AU)
M$Japan<- !!rowSums(sapply(M[c(1:3)], grepl, pattern ='JAPAN'))
日本の正規表現は、もちろん非常に簡単です、しかし、より複雑な場合があります。私は今、提供されるすべての正規表現をテストし、動作しないものが
を含む傾向があることを認識しているError in FUN(X[[i]], ...) :
invalid regular expression '^(?=.*REP).*CZECH|CZECHIA|BOHEMIA', reason 'Invalid regexp'
>
:たとえば、その場合には
> M$Czech_Republic<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?=.*REP).*CZECH|CZECHIA|BOHEMIA"))
は、私は次のエラーを取得しますか
^(?=。*または^(?!
たとえば、単語の境界が2つのバックラッシュ(\ Bではなく元の\ B)でエスケープされていないことに気付きました。私が気付いていないソリューションですか?または別の代替アプローチですか?ここでは、エラーを返す正規表現の完全な例をいくつか示します:
M$China<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*\\BMAC)(?!.*\\BHONG)(?!.*\\BTAI)(?!.*\\BREP).*CHINA|^(?=.*PEO)(?=.*REP).*CHINA"))
M$United_States_of_America<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="UNITED.?STATES\\B(?!.*ISLANDS)|\\BU\.?S\.?A\.?\\B|^\S*U\.?S\.?\\B(?!.*ISLANDS)"))
M$Republic_of_Korea<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*D.*P.*R)(?!.*DEMOCRAT)(?!.*PEOPLE)(?!.*NORTH).*\\BKOREA(?!.*D.*P.*R)"))
ありがとう! SCW
先読みパターンを動作させるには、 'perl = TRUE'を追加します。またチェコの正規表現は '' ^(?=。* REP)。*(?:CZECH(?:IA)?BOHEMIA)のように見えるはずです」「 –
ありがとう、Wiktor。 Perlは私には起こりませんでしたが、それはやっているようです。なぜチェコの正規表現を変更しなければならなかったのですか? – SCW
ちょうど習慣の力。私は '^(?=。* REP)。*'が 'CZECH | CZECHIA | BOHEMIA'のすべての選択肢を参照していると思いました –