[英]Event data to start-stop
我有一個包含日期時間和值的數據框,如下所示:
datetime value
1 2016-05-03 08:51:41 0
2 2016-05-03 10:36:24 0
3 2016-05-03 10:36:32 9
4 2016-05-03 10:45:01 5
5 2016-05-03 10:45:24 0
6 2016-05-03 19:37:02 0
7 2016-05-03 19:37:06 7
8 2016-05-03 19:48:38 0
我想要的是一個表,其中包含值恆定的時間段的開始和結束時間。 對於上面的表,預期輸出如下:
value start stop
1 0 <NA> 2016-05-03 10:36:32
2 9 2016-05-03 10:36:32 2016-05-03 10:45:01
3 5 2016-05-03 10:45:01 2016-05-03 10:45:24
4 0 2016-05-03 10:45:24 2016-05-03 19:37:06
5 7 2016-05-03 19:37:06 2016-05-03 19:48:38
6 0 2016-05-03 19:48:38 <NA>
原始表的輸出
structure(list(datetime = structure(c(1462258301, 1462264584,
1462264592, 1462265101, 1462265124, 1462297022, 1462297026, 1462297718
), class = c("POSIXct", "POSIXt"), tzone = ""), value = c(0,
0, 9, 5, 0, 0, 7, 0)), class = "data.frame", row.names = c(NA,
-8L), .Names = c("datetime", "value"))
使用data.table ...
library(data.table)
setDT(DF)
res = DF[, .(end = datetime[.N]), by=.(value, seq = rleid(value))]
res[.N, end := NA]
value seq end
1: 0 1 2016-05-03 04:36:24
2: 9 2 2016-05-03 04:36:32
3: 5 3 2016-05-03 04:45:01
4: 0 4 2016-05-03 13:37:02
5: 7 5 2016-05-03 13:37:06
6: 0 6 <NA>
我將在此處停止,因為添加start
列是多余的。 如果您真的想要它:
res[, start := shift(end)]
setcolorder(res, c("value", "seq", "start", "end"))
value seq start end
1: 0 1 <NA> 2016-05-03 04:36:24
2: 9 2 2016-05-03 04:36:24 2016-05-03 04:36:32
3: 5 3 2016-05-03 04:36:32 2016-05-03 04:45:01
4: 0 4 2016-05-03 04:45:01 2016-05-03 13:37:02
5: 7 5 2016-05-03 13:37:02 2016-05-03 13:37:06
6: 0 6 2016-05-03 13:37:06 <NA>
這個怎么運作:
DT[i, j, by]
過濾到i
,然后在by
確定的每個子集中計算j
.()
只是list()
的快捷方式 rleid
標識每個“運行”的相同值 .N
是“ by
組”中的行數(如果“ by
為空by
則為表中的行數) :=
通過引用修改列 shift
是滯后/超前運算符 setcolorder
通過引用重新排列列 (請注意,我的結果看起來並不像OP的,或者是因為錯誤的dput
給予或因為POSIX datetime對象是令人難以置信挑剔的。我建議IDateTime
從data.table包來替代。)
假設您的第一個數據框名為x
。 然后做: data.frame(value=names(tapply(x$datetime, x$value, min)), start=tapply(x$datetime, x$value, max), stop=tapply(x$datetime, x$value, max))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.