У меня есть строка, содержащая названия стран и других регионов. Меня интересуют только названия стран, и в идеале я хотел бы добавить несколько столбцов, каждый из которых содержит название страны, указанное в строке. Вот примерный код того, как настроен фрейм данных:
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"))
Если я разделю строку только на пробел, те страны, которые содержат пробел, будут потеряны (например, Великобритания). Посмотреть здесь:
df2 <- separate(df, country, paste0("C",3:8), sep=" ")
Поэтому я попытался найти названия стран, используя набор данных world.cities. Однако это только кажется, что строка перебирается до тех пор, пока не появится имя, отличное от страны. Посмотреть здесь:
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)
Мне интересно, можно ли использовать пробел в качестве разделителя, но определять исключения (например, Соединенное Королевство). Очевидно, это может потребовать некоторой ручной работы, но для меня это наиболее реальное решение. Кто-нибудь знает, как определять такие исключения? Я, конечно, также открыт и благодарен за любые другие решения.
ОБНОВЛЕНИЕ:
Я нашел другое решение, используя пакет countrycode:
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))
Cote d'Ivoire
? Это страна - person akrun   schedule 21.11.2020Cote d'Ivoire
это страна в Африке. Западная Африка, если быть точным. - person Onyambu   schedule 21.11.2020