我正在尝试创建一个向量(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, ...)
这里有几个问题导致你的代码不起作用。
-
for 循环:在这里,你的 i 需要一系列整数来迭代。当你现在有了它,您正在尝试从i = 1循环到"10/05/2017"和"05/05/2017"。一种更有用的方法是使用 seq_along 生成整数序列1 到传递到seq_along的对象长度。
-
dateVec 未编制索引,因此您将覆盖每个日期Vec循环迭代
-
天数长度可变。对于第一个日期,您将生成序列 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试图强制使用数字。