2017-01-17 6 views
1

私は毎時のデータセットで作業しており、各極端なイベントのヒート・スレッショルドより上の "degree hours"を計算する必要があります。私は、各イベントの強度(強度と持続時間を合わせたもの)に関する統計を実行して、同じ期間に複数のサイトを比較する予定です。しきい値より上の連続した温度値を加算して "degree hours"を作成する

データの例:

 Temp 
1  14.026 
2  13.714 
3  13.25 
..... 
21189 12.437 
21190 12.558 
21191 12.703 
21192 12.896 

データ18度の閾値を超えるだけ時間を選択し、18の上方度を明らかにするために18を差し引いた:

 Temp 
5297 0.010 
5468 0.010 
5469 0.343 
5470 0.081 
5866 0.010 
5868 0.319 
5869 0.652 

Iが必要このステップの後に役立ち読書が私の指定された閾値を超えた間の連続した合計時間。私は、時系列内または追加の列を追加することにより、これらのデータを操作する議論しましたが、私はそれぞれの温暖化イベントのために複数の行をしたくない

 Temp 
    1 0.010 
    2 0.434 
    3 0.010 
    4 0.971 

:私は上記のサンプルのうち、生成するために期待しています

。私は非常にアドバイスを感謝します。

答えて

0

確かに他の方法がありますが、これには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 
0

これは、ベースR.における代替ソリューションである

あなたは歩き回るデータをいくつか持っており、カットオフ以上のポイントを合計したいとします。このようになります

set.seed(99999) 
x <- cumsum(rnorm(30)) 
plot(x, type='b') 
abline(h=2, lty='dashed') 

:たとえば

enter image description here

まず、我々は、彼らがカットオフを横断するときに基づいてグループにして、データを分割したいです。我々は、圧縮されたバージョンを取得する指標にランレングス符号化を使用することができます値を有する

x.rle <- rle(x > 2) 

Run Length Encoding 
    lengths: int [1:8] 5 2 3 1 9 4 5 1 
    values : logi [1:8] FALSE TRUE FALSE TRUE FALSE TRUE ... 

最初のグループは、x> 2がFALSEである最初の5点です。第2のグループは以下の2つのポイントであり、以下同様である。

我々は、RLEオブジェクト内の値を置換することによって、グループIDを作成し、バック変換することができる:

:最後

x.rle$values <- seq_along(x.rle$values) 
group <- inverse.rle(x.rle) 

、我々はカットオフより上のデータのみを保持する、グループによって集計します

aggregate(x~group, subset = x > 2, FUN=sum) 

生成:

group   x 
1  2 5.113291213 
2  4 2.124118005 
3  6 11.775435706 
4  8 2.175868979 
関連する問題