1

イベントがデータフレームの日付の列として保存されているときに、連続するイベント間の時間を取得する方法を理解しようとしています。

sampledf=structure(list(cust = c(1L, 1L, 1L, 1L), date = structure(c(9862, 
9879, 10075, 10207), class = "Date")), .Names = c("cust", "date"
), row.names = c(NA, -4L), class = "data.frame")

私は答えを得ることができます

as.numeric(rev(rev(difftime(c(sampledf$date[-1],0),sampledf$date))[-1]))
# [1]  17 196 132

しかし、それは本当に醜いです。特に、ベクトルの最初の項目を除外する方法しか知りませんが、最後の項目を除外する方法はわかりません。そのため、最後の値を削除するには、rev()を2回実行する必要があります。

もっと良い方法はありますか?

ちなみに、私はddplyを使用して、各cust idのより大きなデータセットに対してこれを行うので、ソリューションはddplyで動作する必要があります。

library(plyr)
ddply(sampledf, 
              c("cust"), 
              summarize,
              daysBetween = as.numeric(rev(rev(difftime(c(date[-1],0),date))[-1]))
)

ありがとうございました!

4

2 に答える 2

5

これをお探しですか?

as.numeric(diff(sampledf$date))
# [1]  17 196 132

最後の要素を削除するには、次を使用しますhead

head(as.numeric(diff(sampledf$date)), -1)
# [1]  17 196

require(plyr)
ddply(sampledf, .(cust), summarise, daysBetween = as.numeric(diff(date)))

#   cust daysBetween
# 1    1          17
# 2    1         196
# 3    1         132
于 2013-03-04T23:38:51.290 に答える
2

を使用できますdiff

as.numeric(diff(sampledf$date))

最後の要素を省略するには、次のようにします。

[-length(vec)] #where `vec` is your vector

diffこの場合、すでに1つの要素が短いため、何も省略する必要はないと思います。

test <- ddply(sampledf, 
      c("cust"), 
      summarize,
      daysBetween = as.numeric(diff(sampledf$date)
))
test
#  cust daysBetween
#1    1          17
#2    1         196
#3    1         132
于 2013-03-04T23:40:05.713 に答える