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)を返します何かをしたいです。これを行うことができる単純な関数がありますか(またはこの関数を扱うために関数を使うこともできますか)?
両方の列が同じであるランレングスを知りたい。たとえば、次のデータで:複数の列を持つrleの使用R
v1 v2
1 1
1 1
1 2
1 3
2 3
2 4
2 4
私はRLE機能は、単一の列のために何をするかに似た(2,1,1,1,2)を返します何かをしたいです。これを行うことができる単純な関数がありますか(またはこの関数を扱うために関数を使うこともできますか)?
私たちは、一緒に列をpaste
rle
を適用し、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
であるとを得ることができます
'paste0'に似た別の解決策があります:' library(tidyr); rle(unite(df1、v、1:ncol(df1)、sep = "")$ v)$ length' –
'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
@UweBlockはい、そうです。だから、私はあなたのコメントに記載されたケースのために 'rleid'を含めました。 – akrun