stringr извлекает текст на основе заглавных букв и позиции

Я пытаюсь извлечь некоторые слова (названия стран) из строк. Строки являются элементами списка, например,

myList <- list(associations =  c("Madeup speciesone: \r\n\t\t\t\t",  "Foobarae foobar: Russia - 123,",
                              "Foobarus foobar France -  7007,Italy -  7007,Portugal -  6919,Ukraine -  42264,Russia -  7009,", 
                              "Foobarus foobarbar", 
                              "Foobaria foobariana f. sp. foobaricol Japan - 254, China - 256,")) 

Я хочу извлечь название страны, и, например, я мог бы сделать это:

Country_name <- lapply(myList, pattern = "China|France|Italy|Ukraine", str_extract_all)
country_list <- vector()
for(i in 1:length(Country_name[[1]])){
  country_list[i] <- paste(Country_name[[1]][[i]], collapse = ",")
}

Но для этого потребуется перечислить все возможные страны, что кажется трудоемким.

Есть ли способ использовать регулярные выражения для извлечения всех названий стран? Что-то вроде начала со второго слова с заглавной буквы, а затем извлечения всех стран до конца строки?

Использование чего-то вроде lapply(myList, word, 3) не совсем работает из-за переменной длины названий видов (например, Foobaria foobariana f. sp. foobaricol).

# desired output
country_list <- c("","Russia","France,Italy,Portugal,Ukraine,Russia","","Japan,China")

person nofunsally    schedule 10.10.2016    source источник
comment
Пожалуйста, проверьте, соответствует ли объект myList тому, что вы хотели. В исходном сообщении не было части list, и я отредактировал, предположив, что это необходимо.   -  person nicola    schedule 10.10.2016
comment
С отредактированным myList вы можете попробовать: lapply(str_extract_all(myList$associations,"(?!^)[A-Z]\\w+"),paste,collapse=",").   -  person nicola    schedule 10.10.2016
comment
@nicola редактирование myList - это то, что я намеревался. Ваш код работает. \\w+ - это граница слова, правильно? а также   -  person nofunsally    schedule 10.10.2016
comment
\\w+ относится к любому символу слова, за исключением границ слова. Вы также можете написать это как (?<!^)[:upper:][:lower:]+.   -  person Michael Griffiths    schedule 10.10.2016


Ответы (1)


Вы можете извлечь названия стран, используя пакет countrycode

library(countrycode)
countries <- as.data.frame(countrycode_data$country.name)

Если вы хотите придерживаться своего кода, вы можете создать строку, состоящую из названий всех стран, разделенных символом «|».

all <- paste(countrycode_data$country.name, collapse="|")

Затем работает

Country_name <- lapply(myList, pattern = all, str_extract_all)

country_list <- vector()
for(i in 1:length(Country_name[[1]])){
country_list[i] <- paste(Country_name[[1]][[i]], collapse = ",")
}

должен дать вам результат:

myList <- list(associations =  c("Madeup speciesone: \r\n\t\t\t\t",  "Foobarae foobar: Russia - 123,",
                             "Foobarus foobar France -  7007,Italy -  7007,Portugal -  6919,Ukraine -  42264,Russia -  7009,", 
                             "Foobarus foobarbar", 
                             "Foobaria foobariana f. sp. foobaricol Japan - 254, China - 256,",
                             "Germany",
                             "555Senegal")) 

Country_name <- lapply(myList, pattern = all, str_extract_all)

country_list <- vector()

for(i in 1:length(Country_name[[1]])){
country_list[i] <- paste(Country_name[[1]][[i]], collapse = ",")
}

country_list
[1] ""          ""                "France,Italy,Portugal,Ukraine"
[4] ""          "Japan,China"     "Germany"                      
[7] "Senegal" 
person Community    schedule 10.10.2016