【发布时间】:2011-12-21 11:09:14
【问题描述】:
给定一个日期时间值向量,我需要创建一个 data.frame,其中包含每个原始日期时间后 0:10 小时的日期时间 - 第一列过去 0 小时,第二列过去 1 小时,等等。
我很难找到使用lubridate 的东西轻松做到这一点的方法。我认为这应该可行:
rt <- ymd_hms(c("2011-11-03 19:24:12", "2011-10-28 20:48:21",
"2011-11-04 10:06:14", "2011-10-31 17:10:05", "2011-10-28 06:35:59"))
result <- outer(rt, hours(0:10), "+")
但是该管道中的各个部分都发生了故障。最终我得到这个错误:
Error in FUN(X[[1L]], ...) : invalid 'times' argument
这似乎来自rep.POSIXct() 或rep.period() 无法处理非单位长度times 参数。什么的。
而且它可能无论如何也行不通,因为outer() 返回一个矩阵,而日期对象,甚至 POSIXct 日期(在内部只是整数)似乎都不能是矩阵中的元素。
经过大约 10 次其他猜测后,我发现可行的方法(只是为了获取时间,而不是将它们放入数据框中)是这样的:
with_tz(do.call(c, lapply(rt, function(x) x+hours(0:3))), tz(rt[1]))
with_tz() 添加是必要的,因为c() 丢失了时区属性。我还必须使用do.call(c, lapply(...)) 而不仅仅是sapply(...),因为sapply() 失去了约会这一事实。
也许另一种选择是通过执行do.call(cbind, ...) 或其他方式来创建数据框。
一般来说,如果我们发现 R 日期/时间任务在概念上看起来很简单,但在找到解决方案之前需要大量练习,我们可以通过更改 lubridate 或其他方式来消除障碍.我想这可能是其中之一。 =)
【问题讨论】:
-
如果你向
lubridate提交补丁,我认为@hadley 会很高兴。你可以在这里提交问题(和你的补丁代码):github.com/hadley/lubridate/issues -
在过去的几个月里,我实际上已经为其他 2 个问题(请参阅github.com/kenahoo/lubridate)做到了这一点,@hadley 对此表示赞赏,但他们没有被采纳。 Lubridate 自 5 月以来一直没有提交,看来它可能处于开发停滞状态。
-
我认为您应该编辑标题。您已经承认 external 不可能返回日期时间值。
标签: r outer-join lubridate