2016-07-06 2 views
4

A, B 및 C로 코딩 된 일련의 이벤트가 있습니다. 각 요소에 대해이 요소가 반복 된 횟수를 계산해야합니다 전에 반복되었지만 카운터가 각 행에 대해 하나씩 감소해야합니다. 각 항목의 첫 번째 만남에서 카운터는 0입니다. 예 :요소가 반복되거나 반복되지 않는 횟수를 Count (R)

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에서 x 열을 생성해야합니다. 나는 실행 길이에 rle을 사용할 수 있다는 것을 알고 있지만 카운터 감소를 위해 특정 이벤트가 마지막으로 발생한 이후로 시간을 얻는 방법을 알지 못합니다.

+0

미안하지만, 작은 실수는 행 7에서 값이 -2가되어야합니다. 7 번 이벤트 == 'A'의 이전 값인 'A'카운터는 2 번 (3 번 행)이므로 4 번 카운터 = 1, 5 번 카운터 = 0, 6 번 카운터 = -1, 행상 7 카운터 = -2. B에 대해서도 마찬가지입니다. B의 마지막 카운터 값은 0이었고 이전 B 이후 4 행이있었습니다. 현재 이벤트가 이전 행과 동일하면 카운터가 1 씩 증가하고 그렇지 않으면 1 씩 감소합니다. 각 이벤트 유형에 대해 별도의 카운터가 있습니다. –

+0

또한 9 번 행의 A 값을 실수로 수정했습니다. 그 일을 계산하면 어떻게됩니까. –

답변

2

나는 이것이 문제를 해결하기위한 R 방법의 일종이라고 생각합니다. 동일한 방법으로 x에있는 모든 다른 요소의 색인을 계산할 수 있습니다. 처음 위치로 오프셋 한 다음 함께 결합합니다.

X에서 각각의 고유 한 요소에 대해 별도의 인덱스를 계산한다

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 기능을 사용하여 하나에 목록을 결합 : 각각의 고유 한 요소에 대해 우리에게 인덱스의 목록을 제공

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) 
}) 

을 필요한 것을 제공해야합니다.

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] 
관련 문제