2016-12-29 3 views
0

両方の列が同じであるランレングスを知りたい。たとえば、次のデータで:複数の列を持つrleの使用R

v1 v2 
1 1 
1 1 
1 2 
1 3 
2 3 
2 4 
2 4 

私はRLE機能は、単一の列のために何をするかに似た(2,1,1,1,2)を返します何かをしたいです。これを行うことができる単純な関数がありますか(またはこの関数を扱うために関数を使うこともできますか)?

答えて

4

私たちは、一緒に列をpasterleを適用し、lengths

rle(do.call(paste0, df1))$lengths 
#[1] 2 1 1 1 2 

それともdata.table

library(data.table) 
setDT(df1)[, .N, .(v1, v2)]$N 
#[1] 2 1 1 1 2 

またはより良いアプローチdata.table

rleidであるとを得ることができます
+1

'paste0'に似た別の解決策があります:' library(tidyr); rle(unite(df1、v、1:ncol(df1)、sep = "")$ v)$ length' –

+0

'data.table入力データに 'v1'と' v2'の値が同じように組み合わされた別の行が存在すると、 'setNT(df1)[、.N、。(v1、v2)] $ N'は失敗します。例えば。これを 'df2 < - rbind(df1、df1)'に適用すれば '4 2 2 2 4'となり、正解は' 2 1 1 1 2 2 1 1 1 2 'となります。 – Uwe

+0

@UweBlockはい、そうです。だから、私はあなたのコメントに記載されたケースのために 'rleid'を含めました。 – akrun

関連する問題