3

私はRを数か月間使用していますが、5分ごとのデータを含む動物園シリーズに問題があります。シリーズに欠落している時点はありませんが、データにはいくつかのNaN値があります。

>str(SerieCompleta)
‘zoo’ series from 2011-01-01 to 2011-12-31 23:55:00
 Data: num [1:104737, 1] 0 0 0 0 0 0 0 0 0 0 ...
- attr(*, "na.action")=Class 'omit'  num [1:383] 2017 3745 5761 6786 6787 ...
 Index:  POSIXct[1:104737], format: "2011-01-01 00:00:00" "2011-01-01 00:05:00" ...

データのグループの最大数を見つける必要があります。データのグループは、ゼロ値で30分以上連続して分離する必要があります。

2011-01-02 05:15:00 0
2011-01-02 05:20:00 0
2011-01-02 05:25:00 0
2011-01-02 05:30:00 0
2011-01-02 05:35:00 0.1 |
2011-01-02 05:40:00 0.2 <--- maximum of group
2011-01-02 05:45:00 0.2 |
2011-01-02 05:50:00 0.1 |
2011-01-02 05:55:00 0.1 |
2011-01-02 06:00:00 0.1 |
2011-01-02 06:05:00 0.1 |
2011-01-02 06:10:00 0   |
2011-01-02 06:15:00 0   |
2011-01-02 06:20:00 0.1 |
2011-01-02 06:25:00 0
2011-01-02 06:30:00 0
2011-01-02 06:35:00 0
2011-01-02 06:40:00 0     thirty or more consecutive minutes with zero values on data
2011-01-02 06:45:00 0
2011-01-02 06:50:00 0
2011-01-02 06:55:00 0
2011-01-02 07:00:00 0.2 |
2011-01-02 07:05:00 2.5 <--- maximum of group
2011-01-02 07:10:00 0 

出力は次のようになります。

2011-01-02 05:40:00 0.2
2011-01-02 07:05:00 2.5

R機能を使用してこれを行う方法があるかどうかはわかりません。提案を事前に感謝します。

4

1 に答える 1

1

データ列を呼び出しますxx日付と時刻ではなく、数値データのみが含まれます)。さらに、欠落している時点がなく、すべての時点が5分離れていると仮定します。これは、2列の行列を返す関数です。各行には、グループの開始インデックスと終了インデックスが含まれています(開始と終了のゼロは無視されます)。

blocks <- function(x) {
    z <- rle(x==0)
    breaks <- which(z$lengths >= 6 & z$values == TRUE)
    breaks <- breaks[!breaks %in% c(1, length(z$lengths))]
    break.idx <- cumsum(z$lengths)
    cbind(c(1, break.idx[breaks] + 1), c(break.idx[breaks-1], length(x)))
}

あなたのデータについては、あなたは得るでしょう

> x
 [1] 0.0 0.0 0.0 0.0 0.1 0.2 0.2 0.1 0.1 0.1 0.1 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0
[20] 0.0 0.0 0.1 2.5 0.0
> blocks(x)
     [,1] [,2]
[1,]    1   14
[2,]   22   24

次に、グループに関数を適用which.maxして、最大値のインデックスを取得します。

> apply(blocks(x), 1, function(i) {which.max(x[i[1]:i[2]]) + i[1] - 1})
[1]  6 23
于 2012-06-15T05:17:38.077 に答える