简体   繁体   中英

Splitting a string conditional on another column

I would like to split a variable called country conditional on whether it has a year in it (Albania2009 vs. Albania).

In addition, where the variable does not have a year (ie Albania), I would like to copy the country name to cname and manually put a year in cyear .

   idstd   id    xxx        id1        country 
   <dbl+>   <dbl> <dbl+lbl> <dbl+lbl>   <chr>
 1 445801   NA      NA       7          Albania2009 
 2 542384 4616555 1163       7          Albania  
 3 445801   NA      NA       7          Albania2009 
 4 542384 4616555 1163       7          Albania  

I first tried myself, making use of the fact that id is NA when country has a year in it:

CAmerica0306P$cyear <- NA
CAmerica0306P$cname <- NA
for (i in 1:nrow(df)) {
if (df$id[i]==NA) {
df[i,] <- separate(df, country[i], into = c("cname", "cyear"), -4)
} else {
df$cyear[i,] <- 2001
df$cname[i,] <- df$country[i,]
}
}

But it splits everything. After checking stackoverflow I tried:

df <- df %>% 
    extract(country, into=c("cname", "cyear"), regex="^(?=.{1,7}$)([a-zA-Z]+)([0-9].*)$", remove=FALSE)

but it does not fill the cells (still NA's).

Desired output:

   idstd   id    xxx        id1        country   cyear cname
   <dbl+>   <dbl> <dbl+lbl> <dbl+lbl>   <chr>   <dbl>
 1 445801   NA      NA       7          Albania  2009 Albania  
 2 542384 4616555 1163       7          Albania  2001 Albania  
 3 445801   NA      NA       7          Albania  2009 Albania  
 4 542384 4616555 1163       7          Albania  2001 Albania  

Any suggestions?

Example data: (you should provide ready to use data)

df1<-
data.frame(country = I(paste0("Albania",c("",2007:2012,""))) )

code:

df1$cname <-sub("\\d+$","", df1$country)      #remove all numbers in the end

df1$cyear <-gsub("[^0-9]","", df1$country)    #remove everything that is not a number
df1$cyear[df1$cyear == ""] <- 2001            #where no year is prominent insert 2001

df1$country<- df1$cname

result:

#  country   cname cyear
#1 Albania Albania  2001
#2 Albania Albania  2007
#3 Albania Albania  2008
#4 Albania Albania  2009
#5 Albania Albania  2010
#6 Albania Albania  2011
#7 Albania Albania  2012
#8 Albania Albania  2001

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM