2016-10-10 5 views
0

Ich versuche, einige Wörter (Ländernamen) aus Strings zu extrahieren. Die Saiten sind Listenelemente, zum Beispielstringr extrahieren Text basierend auf Captialization und Position

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,")) 

ich den Namen des Landes extrahieren möchten, und zum Beispiel, könnte ich dies tun:

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 = ",") 
} 

Aber müssten alle möglichen Länder für sie zur Liste zu arbeiten, was mühsam erscheint.

Gibt es eine Möglichkeit, mit regulären Ausdrücken alle Ländernamen zu extrahieren? Etwas wie bei dem zweiten Großbuchstaben beginnen und dann alle Länder bis zum Ende der Zeichenkette extrahieren?

Mit etwas wie lapply(myList, word, 3) funktioniert nicht ganz wegen der variablen Länge der Artnamen (z. B. Foobaria foobariana f. Sp. Foobaricol).

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

Bitte, sehen, ob das 'myList' Objekt ist das, was Sie bestimmt. Es gab nicht den "Listen" -Teil im ursprünglichen Post und ich editierte, vorausgesetzt, es wurde benötigt. – nicola

+1

Mit der so bearbeiteten 'myList' könnten Sie versuchen:' lapply (str_extract_all (myList $ associations, "(?! ^) [A-Z] \\ w +"), einfügen, collapse = ",") '. – nicola

+0

@nicola die myList-Bearbeitung ist, was ich vorhatte. Dein Code funktioniert. '\\ w +' ist eine Wortgrenze, richtig? und – nofunsally

Antwort

0

Sie können Ländernamen extrahieren mit dem Paket countrycode

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

Wenn Sie Ihren Code halten möchten, können Sie eine Zeichenfolge erstellen aller Ländernamen aus, die durch getrennt sind „|“

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

Dann

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 = ",") 
} 

läuft, sollte man das Ergebnis geben:

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" 
Verwandte Themen