確かに他の方法がありますが、これにはdata.table
を使用します。
library(data.table)
setDT(df)
temp.threshold <- 18
まず、あなたのデータの各1から以前値を示す列を作ります。これは、温度がしきい値を上回った時点を見つけるのに役立ちます。
df[ , lag := shift(Temp, fill = 0, type = "lag") ]
今Temp
列と比較してその前の値の列を使用しています。温度が上回った後、各シーケンスを与える我々は新しい列のcumsum
を得ることができます今すぐ0
df[ , group := 0L
][ Temp > temp.threshold & lag <= temp.threshold, group := 1L ]
として、温度が1でしきい値を超える上昇した時にすべての点、および他のすべての点をマークそれ自身の閾値group
ID。
df[ , group := cumsum(group) ]
ここで、しきい値を超えないすべての値を取り除くことができます。
df <- df[ Temp > temp.threshold, ]
各グループの「度数」を調べることで、残っていることをまとめます。データがしきい値を超えて上昇したところ、私はテストイベントのカップルを提供するために、あなたの入力データを少し修正
bygroup <- df[ , sum(Temp - temp.threshold), by = group ]
:そのデータで
structure(list(num = c(1L, 2L, 3L, 4L, 5L, 21189L, 21190L, 21191L,
21192L, 21193L, 21194L), Temp = c(14.026, 13.714, 13.25, 20,
19, 12.437, 12.558, 12.703, 12.896, 21, 21)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -11L), .Names = c("num",
"Temp"), spec = structure(list(cols = structure(list(num = structure(list(), class = c("collector_integer",
"collector")), Temp = structure(list(), class = c("collector_double",
"collector"))), .Names = c("num", "Temp")), default = structure(list(), class = c("collector_guess",
"collector"))), .Names = c("cols", "default"), class = "col_spec"))
が、ここでは上記のコードの出力です($V1
があることに注意"度時間")において:
> bygroup
group V1
1: 1 3
2: 2 6