Bagaimana cara mengidentifikasi semua nama negara yang disebutkan dalam sebuah string dan membaginya sesuai dengan itu?

Saya memiliki string yang berisi nama negara dan wilayah lainnya. Saya hanya tertarik pada nama negara dan idealnya ingin menambahkan beberapa kolom, yang masing-masing berisi nama negara yang tercantum dalam string. Berikut adalah kode contoh untuk cara pengaturan kerangka data:

df <- data.frame(id = c(1,2,3),
                 country = c("Cote d'Ivoire Africa Developing Economies West Africa",
                              "South Africa United Kingdom Africa BRICS Countries",
                             "Myanmar Gambia Bangladesh Netherlands Africa Asia"))

Jika saya hanya membagi string berdasarkan spasi, negara-negara yang memiliki spasi akan hilang (misalnya Inggris). Lihat disini:

df2 <- separate(df, country, paste0("C",3:8), sep=" ") 

Oleh karena itu, saya mencoba mencari nama negara menggunakan dataset world.cities. Namun, ini sepertinya hanya mengulang string sampai ada nama non-negara. Lihat disini:

library(maps)
library(stringr)
all_countries <- str_c(unique(world.cities$country.etc), collapse = "|")
df$c1 <- sapply(str_extract_all(df$country, all_countries), toString)

Saya bertanya-tanya apakah mungkin menggunakan spasi sebagai pembatas tetapi menentukan pengecualian (seperti Inggris Raya). Ini jelas memerlukan beberapa pekerjaan manual, tetapi tampaknya merupakan solusi yang paling layak bagi saya. Adakah yang tahu cara mendefinisikan pengecualian seperti itu? Saya tentu saja juga terbuka dan berterima kasih atas solusi lainnya.

PEMBARUAN:

Saya menemukan solusi lain menggunakan paket kode negara:

library(countrycode)
countries <- data.frame(countryname_dict)
countries$continent <- countrycode(sourcevar = countries[["country.name.en"]],
                                   origin = "country.name.en",
                                   destination = "continent")

africa <- countries[ which(countries$continent=='Africa'), ]

library(stringr)
pat <- paste0("\\b", paste(africa$country.name.en , collapse="\\b|\\b"), "\\b")
df$country_list <- str_extract_all(df$country, regex(pat, ignore_case = TRUE))

person Lisa    schedule 20.11.2020    source sumber
comment
Itu mungkin, tetapi Anda mungkin bisa melakukan hal serupa di banyak negara   -  person akrun    schedule 21.11.2020
comment
Hai, terima kasih atas balasan cepatnya. Bisakah Anda menjelaskan bagaimana hal ini bisa terjadi? Terima kasih!   -  person Lisa    schedule 21.11.2020
comment
Tergantung apakah Anda memiliki daftar nama negara dengan banyak kata   -  person akrun    schedule 21.11.2020
comment
Sepertinya pada contoh di awal pertanyaan saya; misalnya Afrika Selatan Britania Raya Afrika Negara-negara BRICS   -  person Lisa    schedule 21.11.2020
comment
Bagaimana dengan Cote d'Ivoire ? Apakah itu sebuah negara   -  person akrun    schedule 21.11.2020
comment
@akrun ya, Cote d'Ivoire adalah sebuah negara di Afrika. Afrika Barat tepatnya.   -  person Onyambu    schedule 21.11.2020


Jawaban (1)


Anda dapat melakukan:

library(stringi)
vec <- stri_trans_general(countrycode::codelist$country.name.en, id = "Latin-ASCII")
stri_extract_all(df$country,regex = sprintf(r"(\b(%s)\b)",stri_c(vec,collapse = "|")))
[[1]]
[1] "Cote d'Ivoire"

[[2]]
[1] "South Africa"   "United Kingdom"

[[3]]
[1] "Gambia"      "Bangladesh"  "Netherlands"
person Onyambu    schedule 20.11.2020
comment
Terima kasih banyak. Ini bekerja dengan baik. Satu catatan kecil. Ada = yang hilang. Itu harus: stri_extract_all(df$country,regex = sprintf(r="(\b(%s)\b)",stri_c(vec,collapse = "|"))) - person Lisa; 21.11.2020
comment
Saya baru saja menemukan satu masalah dalam solusi Anda yang belum berhasil saya perbaiki. Ada Nigeria dan Niger dalam string teks dan semua string Nigeria berakhir sebagai Niger (sepertinya kemungkinan kecocokan pertama diekstraksi). Ada ide bagaimana cara memperbaikinya? - person Lisa; 23.11.2020
comment
@Lisa, Anda menambahkan tambahan = ANDA HARUS MELAKUKAN PERSIS SEPERTI YANG DIPOSTING DI ATAS. tidak ada = yang hilang. Perhatikan itu - person Onyambu; 23.11.2020
comment
Terima kasih atas balasan Anda @Onyambu, jika saya melakukannya, saya mendapatkan pesan kesalahan berikut di R: Kesalahan: konstanta string tak terduga di stri_extract_all(df$country,regex = sprintf(r(\b(%s)\b).Sementara itu Saya menemukan solusi menggunakan paket kode negara (lihat pertanyaan yang diperbarui) - person Lisa; 23.11.2020
comment
@Lisa, sepertinya Anda menggunakan versi R yang lebih lama. Ubah ke sprintf('\\b(%s)\\b',.......) saja. Titik-titik berarti menjaga segala hal lainnya - person Onyambu; 23.11.2020
comment
Terima kasih banyak! - person Lisa; 23.11.2020