2014-02-05 6 views
3

У меня проблема. Например, у меня есть это:Сбросить значение cumsum до нуля в R

id truth count 
1 1  1 
2 1  2 
3 0  0 
4 1  1 
5 1  2 
6 1  3 
8 0  0 

Я попытался это:

fun <- rle(df$truth) 

df$count <- unlist(sapply(fun$lengths, function(x) {return(1:x)})) 

Но это не работает.

+1

Что должно произойти, если в «истине» происходят два или более последовательных нуля? Как ваш код выходит из строя? – krlmlr

+0

Если происходит больше последовательных нулей, то счет всегда равен нулю, кроме случаев, когда он находится в столбце «Истина» 1. И затем повторите 1,2,3. Например: 1 0 0 0 1 1 1 -> 1 0 0 0 1 2 3 –

+0

Почему бы просто не добавить в конце: 'df $ count [df $ truth == 0] <- 0'? –

ответ

6

Вот такой подход. На основе ave:

transform(dat, count = truth * ave(truth, c(0L, cumsum(diff(truth) != 0)), 
            FUN = seq_along)) 

где dat это имя вашего фрейма данных.

+0

спасибо, я попробую :-) –

+0

Нет, он не работает: -/Результат: 1 1 0 3 1 1 0 –

+0

@ user3275732 К сожалению, произошла ошибка. Теперь это должно сработать. –

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