繁体   English   中英

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

[英]Splitting a string conditional on another column

我想根据country是否有年份来拆分一个名为country的变量(Albania2009 vs. Albania)。

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

有什么建议么?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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