将多年范围转换为R中的年份列表

时间:2016-06-21 21:33:45

标签: r list date

我有一列日期,我试图为每行创建一个年份列表。例如,这是我的几行数据:

1997-2001
1994
2007-2009; 2013-2015; 2016
2007-2008; 2014

例如,对于第一行,我想要一个包含以下内容的列表:1997,1998,1999,2000和2001.对于第二行,我想要一个仅包含1994的列表。对于第三行,我想要一个包含以下内容的列表:2007, 2008,2009,2013,2014,2015和2016.等等。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

这很难看,但它完成了工作:

lapply(strsplit(df$date,'\\s*;\\s*'),function(x) unlist(lapply(strsplit(x,'-'),function(y) { z <- as.integer(y); if (length(z)==1L) z else z[1L]:z[2L]; })));
## [[1]]
## [1] 1997 1998 1999 2000 2001
##
## [[2]]
## [1] 1994
##
## [[3]]
## [1] 2007 2008 2009 2013 2014 2015 2016
##
## [[4]]
## [1] 2007 2008 2014
##

数据

df <- data.frame(date=c('1997-2001','1994','2007-2009; 2013-2015; 2016','2007-2008; 2014'),
stringsAsFactors=F);

注意:如果您的输入向量是一个因子,而不是字符向量,那么在将其传递给初始as.character()调用之前,您必须将其包装在strsplit()中。

答案 1 :(得分:1)

bgoldst的答案解决了这个问题,但这是你可以做到的另一种方式。

您可以使用gsub将分号转换为逗号和破折号,如下所示(其中df是数据框,x是包含数据的列):

df$x<-gsub("-",":",df$x)
df$x<-gsub(";",",",df$x)

会给你:

1997:2001
1994
2007:2009, 2013-2015, 2016
2007:2008, 2014

然后使用for循环来评估所有这些表达式:

years<-list()
for(i in 1:nrow(df)){
     years[i]<-list(eval(parse(text=paste("c(",df$x[i],")"))))
}

如上所述,如果您的输入是因子而非字符的向量,则需要将df$x[i]替换为as.character(df$x[i])