2016-07-06 6 views
4

A、B、Cとコード化された一連のイベントがあります。各要素について、この要素が何回繰り返されたかをカウントする必要があります以前は繰り返されていない場合、カウンターは各行ごとに1つずつ減少します。各項目の最初の出会いには、それに対するカウンターはゼロです。例:シーケンス内の要素の繰り返し回数または反復回数を数えます。

x<-c('A','A','A','B','C','C','A','B','A','C') 
y<-c(0,1,2,0,0,1,-2,-4,-4,-3) 
cbind(x,y) 

     x y 
[1,] "A" "0" 
[2,] "A" "1" 
[3,] "A" "2" 
[4,] "B" "0" 
[5,] "C" "0" 
[6,] "C" "1" 
[7,] "A" "-2" 
[8,] "B" "-4" 
[9,] "A" "-4" 
[10,] "C" "-3" 

xから列yを生成する必要があります。私は実行の長さのためにrleを使うことができることを知っていますが、カウンターが減少する特定のイベントの最後の出会いから時間を得る方法はわかりません。

+0

申し訳ありませんが、小さな間違いは、行7の値は-2にする必要があります。行7のイベント== 'A'の場合、前の 'A'カウンタの値は2(行3)だったので、行4のカウンタ= 1、行5のカウンタ= 0、行6のカウンタ= -1、行7カウンター= -2。同じことがBにも当てはまります - Bの最後のカウンタ値は0で、前のBから4行ありました。現在のイベントが前の行と同じ場合はカウンタが1増加し、イベントタイプごとに個別のカウンタがあります。 –

+0

行9のA値も修正しましたが、間違いがあります。私は物を数えると何が起こるか。 –

答えて

2

私はこの問題を解決する方法の一種だと思います。 xのすべての異なる要素のインデックスを同じ方法で計算し、最初の位置でオフセットしてからそれらを結合することができます。

xのそれぞれのユニークな要素のための別途のインデックスを計算します。

library(data.table) 
sepIndex <- lapply(unique(x), function(i) { 
    s = cumsum(ifelse(duplicated(rleid(x == i)) & x == i, 1, -1)) + min(which(x == i)); 
    # use `rleid` with `duplicated` to find out the duplicated elements in each block. 
    # and assign `1` to each duplicated element and `-1` otherwise and use cumsum for cumulative index 
    # offset the index by the initial position of the element `min(which(x == i))` 
    replace(s, x != i, NA) 
}) 

私たちのそれぞれのユニークな要素のインデックスのリストを与える:

sepIndex 
# [[1]] 
# [1] 0 1 2 NA NA NA -2 NA -4 NA 

# [[2]] 
# [1] NA NA NA 0 NA NA NA -4 NA NA 

# [[3]] 
# [1] NA NA NA NA 0 1 NA NA NA -3 

Reduce機能を使用して一つにリストを組み合わせます

Reduce(function(x, y) ifelse(is.na(x), y, x), sepIndex) 
# [1] 0 1 2 0 0 1 -2 -4 -4 -3 
1

次のような方法があります。ベースR

positions <- sapply(unique(x),function(t) which(x %in% t)) 
values <- sapply(sapply(positions,diff),function(s) c(0,cumsum(ifelse(s>1,-s,s)))) 
df <- data.frame(positions=unlist(positions),values=unlist(values)) 
df[with(df,order(positions)),2] 
関連する問題