我有一列日期,我试图为每行创建一个年份列表。例如,这是我的几行数据:
1997-2001
1994
2007-2009; 2013-2015; 2016
2007-2008; 2014
例如,对于第一行,我想要一个包含以下内容的列表:1997,1998,1999,2000和2001.对于第二行,我想要一个仅包含1994的列表。对于第三行,我想要一个包含以下内容的列表:2007, 2008,2009,2013,2014,2015和2016.等等。有没有办法做到这一点?
答案 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])
。