【问题标题】:Outer product with dates带日期的外产品
【发布时间】: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


【解决方案1】:

这不使用outer(),但我认为它可以让你到达你想要的地方。它确实使用plyr

library("lubridate")
library("plyr")

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"))

offsets = 0:10
names(offsets) <- offsets

dat <- data.frame(llply(offsets, function(offset){rt+hours(offset)}))

offsets 变量命名只会使data.frame 的列名更好。

> str(dat)
'data.frame':   5 obs. of  11 variables:
 $ X0 : POSIXct, format: "2011-11-03 19:24:12" "2011-10-28 20:48:21" ...
 $ X1 : POSIXct, format: "2011-11-03 20:24:12" "2011-10-28 21:48:21" ...
 $ X2 : POSIXct, format: "2011-11-03 21:24:12" "2011-10-28 22:48:21" ...
 $ X3 : POSIXct, format: "2011-11-03 22:24:12" "2011-10-28 23:48:21" ...
 $ X4 : POSIXct, format: "2011-11-03 23:24:12" "2011-10-29 00:48:21" ...
 $ X5 : POSIXct, format: "2011-11-04 00:24:12" "2011-10-29 01:48:21" ...
 $ X6 : POSIXct, format: "2011-11-04 01:24:12" "2011-10-29 02:48:21" ...
 $ X7 : POSIXct, format: "2011-11-04 02:24:12" "2011-10-29 03:48:21" ...
 $ X8 : POSIXct, format: "2011-11-04 03:24:12" "2011-10-29 04:48:21" ...
 $ X9 : POSIXct, format: "2011-11-04 04:24:12" "2011-10-29 05:48:21" ...
 $ X10: POSIXct, format: "2011-11-04 05:24:12" "2011-10-29 06:48:21" ...

更新:

Ken 关于ldply()data.frame(llply()) 的评论让我意识到还有另一种方法可以解决这个问题。

dat <- ldply(rt, `+`, hours(0:10))

给了

> str(dat)
'data.frame':   5 obs. of  11 variables:
 $ V1 : POSIXct, format: "2011-11-03 12:24:12" "2011-10-28 13:48:21" ...
 $ V2 : POSIXct, format: "2011-11-03 13:24:12" "2011-10-28 14:48:21" ...
 $ V3 : POSIXct, format: "2011-11-03 14:24:12" "2011-10-28 15:48:21" ...
 $ V4 : POSIXct, format: "2011-11-03 15:24:12" "2011-10-28 16:48:21" ...
 $ V5 : POSIXct, format: "2011-11-03 16:24:12" "2011-10-28 17:48:21" ...
 $ V6 : POSIXct, format: "2011-11-03 17:24:12" "2011-10-28 18:48:21" ...
 $ V7 : POSIXct, format: "2011-11-03 18:24:12" "2011-10-28 19:48:21" ...
 $ V8 : POSIXct, format: "2011-11-03 19:24:12" "2011-10-28 20:48:21" ...
 $ V9 : POSIXct, format: "2011-11-03 20:24:12" "2011-10-28 21:48:21" ...
 $ V10: POSIXct, format: "2011-11-03 21:24:12" "2011-10-28 22:48:21" ...
 $ V11: POSIXct, format: "2011-11-03 22:24:12" "2011-10-28 23:48:21" ...

请注意,除了不同的列名(V1-V11 而不是 X0-X10)之外,这些日期已转换为本地时间(在我的例子中是 PDT):

> dat$V1
[1] "2011-11-03 12:24:12 PDT" "2011-10-28 13:48:21 PDT"
[3] "2011-11-04 03:06:14 PDT" "2011-10-31 10:10:05 PDT"
[5] "2011-10-27 23:35:59 PDT"

【讨论】:

  • 谢谢,这行得通。我是否正确,您这样做的原因 data.frame(llply(...)) 而不仅仅是 ldply(...) 是按列而不是按行重新组合?如果ldply(和其他*dply 函数)有一个指示连接方向的参数可能会很好。
  • @KenWilliams,这是正确的。 ldply 会将函数调用的结果(在这里,将小时数添加到 rt 向量)组合为行,将它们作为列表返回,然后调用 data.frame 使每个列表成为一列。不过,您的评论确实指出了另一种方法,即通过另一种方式进行迭代。我会把它添加到答案中。
  • 好主意!我从没想过像这样将l*ply 用于外部产品。
猜你喜欢
  • 1970-01-01
  • 2021-03-24
  • 2017-12-22
  • 1970-01-01
  • 2020-06-29
  • 2020-09-03
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
相关资源
最近更新 更多