2016-07-15 4 views
0

Я хотел бы сгенерировать числа в новом столбце, которые приводят к возникновению события в другом столбце. Что может быть самым прямым способом сделать это, используя R или python?генерировать числа перед событием

текущие данные:

var1 var2 event 
0.658 72.193 0 
0.641 70.217 0 
0.641 40.173 0 
0.652 52.687 0 
0.531 50.652 0 
0.529 39.497 1 
0.651 29.291 0 
0.634 59.548 0 
0.711 51.925 0 
0.635 75.772 0 
0.710 53.378 1 
0.660 87.744 0 
0.540 62.547 0 
0.618 38.050 0 
0.602 60.978 1 

желаемый результат:

var1 var2 event event_lead 
0.658 72.193 0   -5 
0.641 70.217 0   -4 
0.641 40.173 0   -3 
0.652 52.687 0   -2 
0.531 50.652 0   -1 
0.529 39.497 1   0 
0.651 29.291 0   -4 
0.634 59.548 0   -3 
0.711 51.925 0   -2 
0.635 75.772 0   -1 
0.710 53.378 1   0 
0.660 87.744 0   -3 
0.540 62.547 0   -2 
0.618 38.050 0   -1 
0.602 60.978 1   0 

ответ

2

Используя R, мы можем попытаться с data.table. Мы создаем переменную группировки (cumsum(event == 1)), основываясь на том, что получаем обратную последовательность, умножьте на -1 и назначьте (:=) ее «event_lead». Затем мы умножаем этот вывод на логический вектор (!event), так что если в «событии» есть 1, оно становится 0 для «event_lead».

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 

Или мы можем использовать ave из base R

with(df1, ave(event, cumsum(event == 1), FUN = function(x) 
       rev(seq_along(x))* - 1) * (!event)) 
#[1] -5 -4 -3 -2 -1 0 -4 -3 -2 -1 0 -3 -2 -1 0 

Или, как @thelatemail упоминалось

with(df1, ave(event, rev(cumsum(rev(event))), 
      FUN=function(x) seq_along(x) - length(x))) 
+1

идеальный! Большое спасибо, @akrun – pyne

+0

есть способ отредактировать это, чтобы мы могли получить оценку как до, так и после диапазона событий? скажем примерно так: '-3 -2 -1 0 1 2 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 ... и т. д. – pyne

+0

@pynewbie - это числа, основанные на примере, который вы показал. Я не понимаю. – akrun

Смежные вопросы