在另一列上分割条件字符串

时间:2018-10-25 08:54:03

标签: r regex for-loop if-statement extract

我想拆分一个名为country的变量,条件是该变量中是否包含年份(Albania2009对阿尔巴尼亚)。

此外,在变量没有年份(即阿尔巴尼亚)的情况下,我想将国家/地区名称复制到cname并在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  

我首先尝试了一下自己,利用当国家中有一年的时候id是NA的事实。

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,]
}
}

但是它分裂了一切。检查stackoverflow后,我尝试:

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

但它不能填充单元格(仍然是NA)。

所需的输出:

   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  

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

示例数据:(您应该提供随时可用的数据)

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

代码:

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

结果:

#  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
相关问题