2009-10-01 8 views
40

Rでは、シーケンス内の同一要素のランを数える最も効率的で簡単な方法は何でしょうか?シーケンスでランを数えるにはどうしたらいいですか?

は、例えば、非負整数のシーケンスにおいて連続するゼロの数をカウントする方法:

x <- c(1,0,0,0,1,0,0,0,0,0,2,0,0) # should give 3,5,2 
+0

あなたがRで回答をしたいですか? もしそうなら、たぶんRタグを持っているのではなく、 "In R ..."で質問を開始するのが賢明でしょう。 – slim

+0

注:これはNAsまたはNaNの実行では機能しません(常に非連続として扱われます)。醜いハックの回避策は、いくつかのセンチネル整数値にNAsとNaNを割り当てることです。 – smci

答えて

62

使用RLE():

y <- rle(c(1,0,0,0,1,0,0,0,0,0,2,0,0)) 
y$lengths[y$values==0] 
+0

そしてこのデータからヒストグラムをどのようにプロットしますか? 私は1から100までの数字と、異なる長さのスクエアを持っているとします。そして、私はヒストグラムを作成して、ある程度の長さのランが起こる頻度や数字が発生する頻度、またはその両方を示すことを望みます。 – skan

+4

これは新しい質問の場ではありません。 –

20

これは、効率的に行うことができ値が変更される場所のインデックスを使用します。

x <- c(1,0,0,0,1,2,1,0,0,1,1) 

値が変更される場所を確認します。

diffs <- x[-1L] != x[-length(x)] 

インデックスを取得し、その後のインデックスの差分を取得する:

idx <- c(which(diffs), length(x)) 
diff(c(0, idx)) 
+0

それは本質的にrle()がやっていることです。 –

+1

申し訳ありません。以前の私のiPhoneにそれを書きました、そして、 "それのためのアプリ"はありません。 :)。私の代わりにロブの答えに投票してください! – Shane

+5

+1:OPの質問に答えるには 'rle()'が簡単な方法ですが、この解決策にはいくつかの場合に他の利点があります。特に、私はランを数えるのではなく、それぞれのランを一意に数える方法を探していました。私は 'c(0、cumsum(x [-1L]!= x [-length(x)]) ) '。 – Simon

関連する問題