从R中的字符串中匹配提取国家名称

Nic*_*nzo 2 r data-processing web-scraping stringr dplyr

我一直在从网站上抓取评论数据,在此过程中,我能够获取包含用户名、评论数量、评论日期和国家/地区信息的字符串向量。它们看起来大致是这样的

raw <- c("Anna (1025) - North Carolina, USA - DEC 20, 2017", 
"James (10) - - MEXICO - NOV 22, 2017", 
"Susane (222) - Oulu, FINLAND - JUNE 1, 2016", 
"Alex (20000) - SOUTH KOREA- MAR 11, 2015")
Run Code Online (Sandbox Code Playgroud)

到目前为止,我可以提取名称、评论编号和日期,因为它们位于定义的位置或具有一致的格式。问题在于,国家/地区名称格式的位置不一致,并且每个字符串中的各个数据点没有一致地用逗号或破折号分隔。仅提取大写字符串就会遇到缺少国家或名称中有两个部分的国家的问题。

地图包包含国家/地区列表。有没有一种方法可以用来str_extract_allstringr国家/地区列表向量中查找匹配项并提取该匹配项?

San*_*osh 5

您可以使用maps库来执行此操作,如下所示:

library(maps)

## Loading country data from package maps
data(world.cities)

raw <- c("Anna (1025) - North Carolina, USA - DEC 20, 2017", 
     "James (10) - - MEXICO - NOV 22, 2017", 
     "Susane (222) - Oulu, FINLAND - JUNE 1, 2016", 
     "Alex (20000) - SOUTH KOREA- MAR 11, 2015")

###Removing punctuation
raw <- gsub("[[:punct:]\n]","",raw)

# Split data at word boundaries
raw2 <- strsplit(raw, " ")

# Match on country in world.countries
CountryList_raw <- (lapply(raw2, function(x)x[which(toupper(x) %in% toupper(world.cities$country.etc))]))

do.call(rbind, lapply(CountryList_raw, as.data.frame))

#      X[[i]]
#1        USA
#2     MEXICO
#3    FINLAND
Run Code Online (Sandbox Code Playgroud)

这有效。但是,您稍后需要修复包含多个单词的国家/地区名称。例如,在本例中为韩国。这是因为strsplit分裂了单词,这就是它无法与 SOUTH KOREA 匹配的原因。