2016-07-19 2 views
1

나는 this question을 물었고 이벤트 이전에 음수를 생성하는 데 완벽한 다음 솔루션을 얻었습니다.이벤트가 발생한 후 새 열의 숫자를 생성합니다.

library(data.table) 
    setDT(df1)[, event_lead:=-(.N:1) ,cumsum(event == 1) 
    ][, event_lead := event_lead* (!event)] 
    df1 
    # var1 var2 event event_lead 
    # 1: 0.658 72.193  0   -5 
    # 2: 0.641 70.217  0   -4 
    # 3: 0.641 40.173  0   -3 
    # 4: 0.652 52.687  0   -2 
    # 5: 0.531 50.652  0   -1 
    # 6: 0.529 39.497  1   0 
    # 7: 0.651 29.291  0   -4 
    # 8: 0.634 59.548  0   -3 
    # 9: 0.711 51.925  0   -2 
    #10: 0.635 75.772  0   -1 
    #11: 0.710 53.378  1   0 
    #12: 0.660 87.744  0   -3 
    #13: 0.540 62.547  0   -2 
    #14: 0.618 38.050  0   -1 
    #15: 0.602 60.978  1   0 

이제이 코드를 조정하여 이벤트 이후에 양수가 다른 열을 갖도록하려고합니다.

> setDT(df1)[, event_lead:=-(.N:1) ,cumsum(event == 1) 
    +   ][, event_lead := event_lead* (!event)] 


    > setDT(df1)[, event_follow:=+(1:.N) ,cumsum(event == 1) 
    +   ][, event_follow := event_follow* (!event)] 

    > df1 
     var1 var2 event event_lead event_follow 
    1: 0.658 72.193  0   -5   1 
    2: 0.641 70.217  0   -4   2 
    3: 0.641 40.173  0   -3   3 
    4: 0.652 52.687  0   -2   4 
    5: 0.531 50.652  0   -1   5 
    6: 0.529 39.497  1   0   0 
    7: 0.651 29.291  0   -4   2 
    8: 0.634 59.548  0   -3   3 
    9: 0.711 51.925  0   -2   4 
    10: 0.635 75.772  0   -1   5 
    11: 0.710 53.378  1   0   0 
    12: 0.660 87.744  0   -3   2 
    13: 0.540 62.547  0   -2   3 
    14: 0.618 38.050  0   -1   4 
    15: 0.602 60.978  1   0   0 

event_follow에서 0 후 1를 건너 않으며, 나는 그것을 어떻게 해결할 수 있습니까?

+0

어느 것이 입력 데이터 세트입니까 – akrun

+0

입력이 [이 첫 번째 질문]과 동일 (http://stackoverflow.com/questions/38387475/generate-numbers-before-an-event) – pyne

+0

고마워, 그게'event_follow' 또는 당신이 얻은 것으로 예상되는 출력이다. 코드를 변경하고 싶습니다. 그것이 후자 인 경우에, 예상 된 것을 보여주는 것이 낫다 – akrun

답변

1

우리는 'event_follow'에 (:=를) '이벤트'의 논리적 벡터로 행의 순서를 곱 할당 논리적 벡터 (event ==1)와 cumsum을 복용의 lag에 의해 그룹화 변수를 만들 수 있습니다. 영업 이익의 포스트, 'event_follow'에서


df1[, event_follow := seq_len(.N) * !event ,cumsum(shift(event ==1, fill = FALSE))] 
df1 
#  var1 var2 event event_lead event_follow 
# 1: 0.658 72.193  0   -5   1 
# 2: 0.641 70.217  0   -4   2 
# 3: 0.641 40.173  0   -3   3 
# 4: 0.652 52.687  0   -2   4 
# 5: 0.531 50.652  0   -1   5 
# 6: 0.529 39.497  1   0   0 
# 7: 0.651 29.291  0   -4   1 
# 8: 0.634 59.548  0   -3   2 
# 9: 0.711 51.925  0   -2   3 
#10: 0.635 75.772  0   -1   4 
#11: 0.710 53.378  1   0   0 
#12: 0.660 87.744  0   -3   1 
#13: 0.540 62.547  0   -2   2 
#14: 0.618 38.050  0   -1   3 
#15: 0.602 60.978  1   0   0 
는 새 그룹이 시작, 1가 그래서 whereever 1입니다 '이벤트'의 누적 합계를 사용하여 만들었습니다.

의 출력을 확인한 경우
df1[, event_follow1 := +(1:.N) ,cumsum(event == 1)] 
df1$event_follow1 
#[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 1 

which(df1$event ==1) 
#[1] 6 11 15 

6 번째, 11 번째 및 15 번째 요소는 새 시퀀스 시작 요소입니다. 새로운 조건 event_follow* (!event)을 곱하면 즉, '이벤트'에 1이있는 위치는 논리 벡터에서 FALSE이므로 'event_follow'의 모든 요소는 0이됩니다.

+0

대단히 감사합니다. 첫 번째 것이 1을 건너 뛰는 이유를 말해 줄 수 있니? – pyne

+1

다시 한번 감사드립니다. @akrun. 대단히 감사합니다. – pyne

관련 문제