1

私は大量のデータを持っていますが、これは代表的な例の1つにすぎません。

data=c(0,0,0,0,0.1,0.1,0.1,0,0,0,0,0.2,0.1,0,0,0.3,0.1,0.1,0,0)

ゼロとは異なる最初の値で始まり、ゼロに等しくない最後の値で終わる個別のイベントを定義しようとしています(イベントにはゼロ値を含めることはできません)。したがって、この場合、(0.1,0.1,0.1)、(0.2,0.1)、および(0.3,0.1,0.1)の3つのイベントが発生します。最初に、ゼロではない最初の数値を定義しようとしました。

events <- list()
for(i in seq(1,length(data),1)){
if(data[i]==0) next
else start1=i

ループがゼロとは異なる最初の値を見つけたとき、私は別のforループでイベントの終了を定義しようとしました(そして繰り返します)が、私の解決策はうまくいきませんでした...

次に、データの一部を使用して新しいリストを定義しようとしました。

events[[paste('ev', end1-start1)]] = data[start1:end1]
rm(start1); rm(end1)
}

変数の名前を変更したときに開始と終了が関数であることを忘れました...ありがとうございます

4

2 に答える 2

4

rle同様に使用しますが、結果を取得する方法は異なります。

rr  <- rle(data != 0)
idx <- rr$lengths[rr$values]
split(data[data != 0], rep(seq(idx), idx))

# $`1`
# [1] 0.1 0.1 0.1

# $`2`
# [1] 0.2 0.1

# $`3`
# [1] 0.3 0.1 0.1
于 2013-03-07T14:23:31.160 に答える
3

どうですか:

データを定義する

data=c(0,0,0,0,0.1,0.1,0.1,0,0,0,0,0.2,0.1,0,0,0.3,0.1,0.1,0,0)

使用rle(コメントでCarl Witthoftが独自に提案したように)

rr <- rle(data!=0)
cc <- c(0,cumsum(rr$lengths))
v <- rr$values

この次のビットはループで実行できます。mapplyもう少し魔法です。SIMPLIFY=FALSE結果がすべて同じ長さである場合に、結果がマトリックスに折りたたまれないように追加することをお勧めします。

mapply(function(start,end) data[start:end],
   cc[v]+1,cc[v]+rr$length[v])

## [[1]]
## [1] 0.1 0.1 0.1

## [[2]]
## [1] 0.2 0.1

## [[3]]
## [1] 0.3 0.1 0.1

私はこれをあまり広範囲にテストしていないことに注意してください...

于 2013-03-07T14:15:08.480 に答える