【问题标题】:Fixing the error associated with creating a sequence of dates between start date and end date in R修复与在 R 中创建开始日期和结束日期之间的日期序列相关的错误
【发布时间】:2020-02-10 23:28:01
【问题描述】:

***注意:请不要链接类似的帖子。我发现了其他几个类似的帖子,但他们的回复并没有解决我得到的错误:“seq.int(0, to0 - from, by) 中的错误:'to' must be afinite number”或“from must be of长度 1".... 我希望了解为什么会出现这些错误语句以及如何防止它们发生...谢谢!

我有一个如下的数据框

    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 

....等填写开始日期和结束日期之间的日期序列

我已经尝试了以下......

one<-as.data.table(one)
one[, startdate:=as.character(startdate)]
one[, enddate:=as.character(enddate)]
one[, startdate:=as.Date(startdate, format="%m/%d/%Y")]
one[, enddate:=as.Date(enddate, format="%m/%d/%Y")]
one<-as.data.frame(one)
one%>%
  rowwise() %>%
  do(data.frame(id=.$id, date=seq(.$startdate,.$enddate,by="day")))

当我运行它时,我收到以下错误: seq.int(0, to0 - from, by) 中的错误:'to' must be afinite number

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

【问题讨论】:

  • 你的例子没有显示这样的条件
  • 能否也检查日期格式是否相同或是否有多种格式。即seq(NA, Sys.Date(), by = '1 day')# Error in seq.default(NA, Sys.Date(), by = "1 day") : 'from' must be a finite number
  • 你能检查一下anydate更新是否显示同样的错误
  • @akrun 我刚刚尝试了 anydate 更新并收到了相同的错误声明...感谢您的所有帮助和建议!
  • 如果您可以分享指向数据的链接或显示错误的小示例,会很有帮助

标签: r dataframe data.table


【解决方案1】:

使用data.table,我们可以使用Map。将'startdate' 'enddate' 转换为Date 类,使用Map 获取对应元素的sequence,rep根据@​​987654327@ 的list 输出的lengths 获取'id'日期,连接日期的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

如果“日期”列中有多种格式,一种选择是 anydateanytime 自动将某些格式转换为 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

数据

one <- structure(list(id = c(1L, 1L, 2L, 3L), startdate = c("01/01/2011", 
"02/03/2012", "03/04/2013", "04/06/2014"), enddate = c("01/05/2011", 
"02/05/2012", "03/06/2013", "04/09/2014")), class = "data.frame", row.names = c(NA, 
-4L))

setDT(one)

【讨论】:

  • 我仍然遇到同样的错误,需要 from 是一个有限数
  • @boodaloo1 我用data 展示了一个可重现的例子。无法重现该问题
  • @boodaloo1 可能您的“结束日期”比原始数据集中的 startdate
  • 我只发布了我框架的几行,因为它有几千个观察值。在任何情况下,我都会检查结束日期是否小于开始日期...感谢您的帮助!
  • @boodaloo1 该错误将是另一个错误。我认为特定的错误是因为某些元素在 a 中。不同的格式,所以当 as.Date 被应用时,它返回 NA 并且这创建了 finite 错误
猜你喜欢
  • 2018-10-16
  • 2017-01-05
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多