10

I have data where the words as follows

 location<- c("xyz, sss, New Zealand", "USA", "Pris,France")
 id<- c(1,2,3)
 df<-data.frame(location,id)

I would like to extract the country name from the data. The tricky part is if i extract just the last word then I will have only one record (France).

library(stringr)
df$country<- word(df$location,-1)

Any ideas on how to extract country data from this data?

 id  location                      country
  1   xyz, sss, New Zealand        New Zealand
  2   USA                          USA
  3   Pris,France                  France
user3570187
  • 1,743
  • 3
  • 17
  • 34

2 Answers2

12

You can try sub

 df$country <- sub('.*,\\s*', '', df$location)
 df$country
 #[1] "New Zealand" "USA"         "France"   

Or

 library(stringr)
 str_extract(df$location, '\\b[^,]+$')
 #[1] "New Zealand" "USA"         "France"     
akrun
  • 874,273
  • 37
  • 540
  • 662
  • 7
    `explanation [sub]:` from `df$location`, replace any character `.`, occuring any number of times `*`, upto a comma, followed by any number/type of whitespace `\\s` with nothing `''` `explanation [str_extract]:` from `df$location`, provide 1 or multiple `+` whole words `\\b`, not `[ ]` in a string that ends in a comma `^,` until the end of the string `$`. (so basically, provide all whole words after comma) – Richard Jul 30 '17 at 06:20
1

stringi solution:

require(stringi)
location<- c("xyz, sss, New Zealand", "USA", "Pris,France")
stri_trim(stri_match_first_regex(location, "(^|,)([^,]*?)$")[,3])
## [1] "New Zealand" "USA"         "France"  

stri_trim removes unnecessary spaces before/after country name.

bartektartanus
  • 15,284
  • 6
  • 74
  • 102