はのは、私は私がalpha
の内容を使用せずに別の配列beta
周期性
beta = c(3,1,3,1,2)
を構築することができるような周期性を見つけることができますどのようにalpha
alpha = c(a,a,a,b,c,c,c,a,c,c)
を持っているとしましょうコード内で?これに答えるために鉛や遅れを使う方法はありますか?
はのは、私は私がalpha
の内容を使用せずに別の配列beta
周期性
beta = c(3,1,3,1,2)
を構築することができるような周期性を見つけることができますどのようにalpha
alpha = c(a,a,a,b,c,c,c,a,c,c)
を持っているとしましょうコード内で?これに答えるために鉛や遅れを使う方法はありますか?
アルファブラインドで値を保持したい場合は、forループを作成し、ロジックを使用してこのアルファの反復が最後と等しい場合にカウンタを起動できます。あなたは、現在の値を受け入れるために過去のアルファを設定し、次のものと比較する必要があります。
2つの値が一致しないと、カウンタ番号がループ外で作成したベクトルに連結され、カウンタが1に戻ります。
方法を学ぶには、これを自分で行うだけで十分です。
ファイルを変数に読み込むことはできますが、手動で数値を入力したり、数値を表示する必要はありません。データが何らかの方法で '保護' されている場合は...ここで
は楽しみのためだけにtabulate
とrleid
library(data.table)
tabulate(rleid(alpha))
#[1] 3 1 3 1 2
を使用してオプションで、ここでは複雑なソリューションです:
alpha <- c('a','a','a','b','c','c','c','a','c','c');
diff(c(0L,which(c(alpha[-1L]!=alpha[-length(alpha)],T))));
## [1] 3 1 3 1 2
alpha[-1L]!=alpha[-length(alpha)];
## [1] FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE
まず、入力要素の隣接するペアが値の等しいブレークを構成するかどうかを表す論理ベクトルを計算します。論理ベクトル内の各要素のインデックスは、入力ベクトル内のペアの最初の要素のインデックスに対応します。
c(alpha[-1L]!=alpha[-length(alpha)],T);
## [1] FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE TRUE
ベクトルの終わりに擬似ブレークを作成するTRUE
値を追加します。明確にするために、次のステップを参照してください。
which(c(alpha[-1L]!=alpha[-length(alpha)],T));
## [1] 3 4 7 8 10
エンドポイント入力ベクトルにおけるランレングスのを表す指標ベクトルに論理ベクトルを変換します。これで前のステップでTRUE
を追加しなければならなかった理由は明らかです。最終ランレングスのエンドポイントは省略される。
c(0L,which(c(alpha[-1L]!=alpha[-length(alpha)],T)));
## [1] 0 3 4 7 8 10
プリペンドゼロ。これは、概念的には、各要素が入力ベクトルランレングスの内外境界を表す「境界ベクトル」にインデックスベクトルを変換するものと考えることができる。明確にするために、次のステップを参照してください。
diff(c(0L,which(c(alpha[-1L]!=alpha[-length(alpha)],T))));
## [1] 3 1 3 1 2
連続した境界の間の差を取ります。これは、所望のランレングスを提供する。
library(data.table);
library(microbenchmark);
bgoldst <- function(alpha) diff(c(0L,which(c(alpha[-1L]!=alpha[-length(alpha)],T))));
akrun <- function(alpha) tabulate(rleid(alpha));
bethany <- function(alpha) { if (length(alpha)==0L) return(integer()); res <- integer(); last <- alpha[1L]; cnt <- 1L; i <- 2L; while (i<=length(alpha)) { if (alpha[i]==last) cnt <- cnt+1L else { res[length(res)+1L] <- cnt; last <- alpha[i]; cnt <- 1L; }; i <- i+1L; }; res[length(res)+1L] <- cnt; res; };
flick <- function(alpha) rle(alpha)$lengths;
alpha <- c('a','a','a','b','c','c','c','a','c','c');
expected <- c(3L,1L,3L,1L,2L);
identical(expected,bgoldst(alpha));
## [1] TRUE
identical(expected,akrun(alpha));
## [1] TRUE
identical(expected,bethany(alpha));
## [1] TRUE
identical(expected,flick(alpha));
## [1] TRUE
microbenchmark(bgoldst(alpha),akrun(alpha),bethany(alpha),flick(alpha));
## Unit: microseconds
## expr min lq mean median uq max neval
## bgoldst(alpha) 8.553 11.1200 14.85308 12.8300 15.3970 70.136 100
## akrun(alpha) 129.151 144.9745 163.64182 156.7350 171.4895 313.898 100
## bethany(alpha) 20.101 23.9500 30.43242 26.5155 37.8475 70.136 100
## flick(alpha) 20.100 23.9495 30.44956 28.0120 32.2890 62.866 100
set.seed(1L); N <- 1e5L; alpha <- sample(letters[1:3],N,T);
expected <- bgoldst(alpha);
identical(expected,akrun(alpha));
## [1] TRUE
identical(expected,bethany(alpha));
## [1] TRUE
identical(expected,flick(alpha));
## [1] TRUE
microbenchmark(bgoldst(alpha),akrun(alpha),bethany(alpha),flick(alpha),times=10L);
## Unit: milliseconds
## expr min lq mean median uq max neval
## bgoldst(alpha) 5.497899 6.469098 11.007558 6.521699 7.297460 49.891634 10
## akrun(alpha) 1.300492 1.370199 1.547461 1.401631 1.464282 2.816091 10
## bethany(alpha) 2865.335271 2891.594408 2941.352229 2924.165053 2997.881411 3024.234204 10
## flick(alpha) 8.060392 9.355323 13.646002 10.055176 10.841843 48.312741 10
あなたはランレングス符号化( 'rle')をお探しですか?私はあなたが「アルファの内容を使わない」ということをどういう意味か分かりません。あなたの入力と希望の出力は正確には何ですか?これはあなたが描いていることをしているようです: 'alpha = c(" a "、" a "、" b "、" c "、" c "、" c "、" a "、" c " c "); rle(alpha)$ lengths' – MrFlick
I second @MrFlickコメント。また、鉛や遅れを使って何を意味するのか、もっと詳しく説明できますか? – zyurnaidi
ありがとうございます!私はrleを探していた! – sharp