2

日時値のベクトルが与えられた場合、元の各data.frame日時を含む日時を作成する必要がありました0:10。最初の列は0時間後、2番目の列は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()'sまたは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ます。そんな時かもしれないと思います。=)

4

1 に答える 1

4

これは を使用しませんが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" ...

アップデート:

ldply()vsについてのケンのコメント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" ...

異なる列名 (X0-X10 ではなく V1-V11) に加えて、これらの日付は現地時間 (私の場合は 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"
于 2011-11-03T18:59:51.683 に答える