修复与在R中创建开始日期和结束日期之间的日期序列有关的错误

时间:2020-02-10 23:28:01

标签: r dataframe data.table

***注意:请不要链接类似的帖子。我发现了其他几处类似的帖子,但是他们的回答并没有解决我得到的错误:“ seq.int(0,to0-from,by)中的错误:'to'必须为有限数”或“ from必须为长度为1“...。我希望了解为什么会出现这些错误声明,以及如何防止出现这些错误声明...谢谢!

我有一个如下数据框

extern

我要转换数据框以便创建以下内容:

    id  startdate  enddate
    1   01/01/2011 01/05/2011
    1   02/03/2012 02/05/2012
    2   03/04/2013 03/06/2013
    3   04/06/2014 04/09/2014

....依此类推,以填充开始日期和结束日期之间的日期顺序

我尝试了以下方法....

    id   date
    1    01/01/2011
    1    01/02/2011
    1    01/03/2011
    1    01/04/2011
    1    01/05/2011
    1    02/03/2012
    1    02/04/2012
    1    02/05/2012
    2    03/04/2013
    2    03/05/2013
    2    03/06/2013 

运行此命令时,出现以下错误:seq.int(0,to0-from,by)中的错误:“ to”必须为有限数字

这是为什么?我该如何修复这段代码?

1 个答案:

答案 0 :(得分:1)

使用data.table,我们可以使用Map。将'startdate''enddate'转换为Date类,使用Map获得相应元素的seq个,rep根据{{日期的lengths中的1}},将日期的list连接起来以创建两列输出

list

如果“日期”列中有多种格式,则一个选项是library(data.table) one[, {lst1 <- Map(seq, as.IDate(startdate, "%m/%d/%Y"), as.IDate(enddate, "%m/%d/%Y"), MoreArgs = list(by = "day")) .(id = rep(id, lengths(lst1)), date = do.call(c, lst1))}] # id date # 1: 1 2011-01-01 # 2: 1 2011-01-02 # 3: 1 2011-01-03 # 4: 1 2011-01-04 # 5: 1 2011-01-05 # 6: 1 2012-02-03 # 7: 1 2012-02-04 # 8: 1 2012-02-05 # 9: 2 2013-03-04 #10: 2 2013-03-05 #11: 2 2013-03-06 #12: 3 2014-04-06 #13: 3 2014-04-07 #14: 3 2014-04-08 #15: 3 2014-04-09 中的anydate,可以将某些格式自动转换为anytime

Date

或使用library(anytime) one[, {lst1 <- Map(seq, anydate(startdate), anydate(enddate), MoreArgs = list(by = "day")) .(id = rep(id, lengths(lst1)), date = do.call(c, lst1))}]

tidyverse

数据

library(dplyr)
library(purrr)
library(tidyr)
library(lubridate)
one %>% 
   transmute(id, date = map2(mdy(startdate), mdy(enddate), seq, by = 'day')) %>% 
   unnest(c(date))
# A tibble: 15 x 2
#     id date      
#   <int> <date>    
# 1     1 2011-01-01
# 2     1 2011-01-02
# 3     1 2011-01-03
# 4     1 2011-01-04
# 5     1 2011-01-05
# 6     1 2012-02-03
# 7     1 2012-02-04
# 8     1 2012-02-05
# 9     2 2013-03-04
#10     2 2013-03-05
#11     2 2013-03-06
#12     3 2014-04-06
#13     3 2014-04-07
#14     3 2014-04-08
#15     3 2014-04-09