2017-01-12 5 views
0

私は以下の2種類の文字を持つベクトルを持っています。文字のベクトルの変化の指標を探すR

dat <- c(rep("A", 3), rep("B", 2), rep("A", 5), rep("B", 4), rep("A", 8)) 

"A"と "B"を含んでいます。私は "A"→ "B"と "B"→ "A"の時にすべての指標を探したい。例えば

> dat 
[1] "A" "A" "A" "B" "B" "A" "A" "A" "A" "A" "B" "B" "B" "B" "A" "A" "A" "A" "A" "A" "A" "A" 

は、私は2つの数値ベクトルを計算する:A2B(3、10)であるべきであり、B2A(5、14)であるべきです。

+3

試行 '(C(DAT [-1]の累積指数を抽出してデータ

r = rle(dat) 

のランレングス符号化表現を作成します!= dat [-length(dat)]、FALSE)) ' – akrun

+3

また、' tmp < - paste(dat、collapse = ""); gregexpr( "AB"、tmp); gregexpr( "BA"、tmp) ' –

+1

より一般的なケースについては、[this post](http://stackoverflow.com/questions/33027611/how-to-index-a-vector-sequence-within- a-vector-sequence)が役立ちます。 "dat"と(i) 'c(" A "、" B ")'、(ii) 'c(" B "、" A ")'を引数として渡しますそこと 'union'結果は必要な出力を与えるはずです。 –

答えて

1
diffs <- diff(as.integer(as.factor(dat))) 
A2B <- which(diffs == 1L) 
B2A <- which(diffs == - 1L) 
1

そして末尾遷移

cumsum(r$lengths)[which(r$value == "B") - 1L] # A2B   
cumsum(r$lengths)[which(r$value == "A") - 1L] # B2A 
関連する問題