私が解決しようとしている問題は、ソートされたPOSIXct変数を持つデータフレームがあることです。各行は分類されており、各レベルの各行間の時間差を求め、そのデータを新しい変数に戻したいと考えています。再現可能な問題は以下の通りです。 以下の関数は、この質問の目的でランダムな時刻のサンプルデータを作成するためのものです。 レベルによってdata.frameの行と前の行の時間差を計算する方法
random.time <- function(N, start, end) {
st <- as.POSIXct(start)
en <- as.POSIXct(end)
dt <- as.numeric(difftime(en, st, unit="sec"))
ev <- sort(runif(N, 0, dt))
rt <- st + ev
return(rt)
}
問題をシミュレートするためのコードは以下の通りである:
set.seed(123)
category <- sample(LETTERS[1:5], 20, replace=TRUE)
randtime <- random.time(20, '2015/06/01 08:00:00', '2015/06/01 18:00:00')
df <- data.frame(category, randtime)
予想される結果のデータフレームは、以下の通りである:
>category randtime timediff (secs)
>A 2015-06-01 09:05:00 0
>A 2015-06-01 09:06:30 90
>A 2015-06-01 09:10:00 210
>B 2015-06-01 10:18:58 0
>B 2015-06-01 10:19:58 60
>C 2015-06-01 08:14:00 0
>C 2015-06-01 08:16:30 150
出力の各サブグループは、最初の行を有することになります前の行がないのでtimediff値は0です。カテゴリ別にグループ化し、次の関数を呼び出して差異を計算することはできましたが、すべてのカテゴリグループの最終出力を照合することができませんでした。
getTimeDiff <- function(x) {
no_rows <- nrow(x)
if(no_rows > 1) {
for(i in 2:no_rows) {
t <- x[i, "randtime"] - x[i-1, "randtime"]
}
}
}
私はこの2日間、運がなかったので、どんな助けにも大いに感謝しています。おかげさまで
感謝。これは、必要に応じて出力を配列する際に部分的に解決します。しかし、lag()は前の行の時刻をtimediffの値として返しますが、実際の値の差は返しません。 – Mntester
@Meterが修正されました。 – JasonAizkalns