次のようなベクトルがある場合
"a": 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0
1
にいくつ集まっているか知りたいのですがa
、この場合、答えは 3 と 2 になります。
これを実行できるスクリプトはありますか?
を参照してください?rle
。
## create example vector
a <- c(rep(0, 3), rep(1, 3), rep(0, 4), rep(1, 2), rep(0, 3))
## count continuous values
r <- rle(a)
## fetch continuous length for value 1
r$lengths[r$values == 1]
# [1] 3 2
これはどう?
test <- c(0,0,0,1,1,1,0,0,0,0,1,1,0,0,0)
rle(test)$lengths[rle(test)$values==1]
#[1] 3 2
大量のデータの場合、複雑な選択を使用して少し高速化できます。
diff(unique(cumsum(test == 1)[test != 1]))
#[1] 3 2
他の人が質問に答えました。2つの所見を追加したいと思います。
データ入力のトリック:スキャンを使用します(デフォルトは「数値」クラスで、repやコンマは不要です)。引数として「character」を追加すると、空白で区切られた文字に対しても機能します。
a <- scan()
1: 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0
16:
Read 15 items
rle
は実際には逆関数ですrep
arle <- rle(a)
rep(arle$values, arle$lengths)
[1] 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0