R - 如何创建具有传播日期的向量



我正在尝试创建一个向量(dateVec(,其中包含日期列中的日期,该日期由"天数">列中的天数传播。我不明白为什么我创建的代码不起作用。日期采用日期格式。

> for ( i in mydata[,1] ) {
>       dateVec = mydata [,1] + 0 : mydata [,2] }

数据具有更多的行,下面是一个示例:

Date (mydata[,1]) -- Days (mydata[,2])
10/05/2017 ----------       3
05/05/2017  ----------      2

我对 dateVec 的期望结果是:

(10/05/2017, 11/05/2017, 12/05/2017, 13/05/2017, 05/05/2017, 06/05/2017, 07/05/2017, ...)

这里有几个问题导致你的代码不起作用。

  1. for 循环:在这里,你的 i 需要一系列整数来迭代。当你现在有了它,您正在尝试从i = 1循环到"10/05/2017"和"05/05/2017"。一种更有用的方法是使用 seq_along 生成整数序列1 到传递到seq_along的对象长度。

  2. dateVec 未编制索引,因此您将覆盖每个日期Vec循环迭代

  3. 天数长度可变。对于第一个日期,您将生成序列 3天长,第二次约会,2天。您将需要一个可以处理可变长度元素(如列表(的数据结构。

修改现有代码:

    mydata <- data.frame(Date = as.Date(c("10/05/2017", "05/05/2017"),
                         format = "%d/%m/%Y"), Days = c(3, 2))
    dateVec <- list()
    for (i in seq_along(mydata[, 1])) {
       dateVec[[i]] = mydata [i, 1] + 0 : mydata [i, 2]
     }
    res <- do.call("c", dateVec)

一种更 r 惯用的方法是使用 mapply 并行传递开始日期和时间长度以返回一个列表,然后将其连接到日期向量

res <- do.call("c", mapply(function(x, y) seq(from = x, length.out = y,
     by = "1 day"), x = mydata[["Date"]], y = mydata[["Days"]]))

这是一个笨拙的解决方案:

library("lubridate")
mydata = data.frame(Date = dmy(c("10/05/2017", "05/05/2017")),
                    Days = c(3,2))
dateVec = dmy(character())
for(i in 1:length(mydata$Date)){
  dateVec = c(dateVec,mydata$Date[i])
  for(j in 1:mydata$Days[i]){
    dateVec = c(dateVec, mydata$Date[i]+j)
  }
}

请注意,这使用润滑剂包,并且不会像您那样格式化日期。我还发现有趣的是,我必须dateVec初始化为日期对象。最初我尝试dateVec = c()但R试图强制使用数字。

最新更新