Создать рекурсивные переменные в Tidy - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь найти правильное решение, чтобы создать переменную продолжительности, основанную на том, произошло какое-то событие или нет. Это очень просто сделать в цикле for, как

    library(tidyverse)
    df <- tibble(event = c(0,0,0,0,1,0,0,1,1,0,0,1))
    df$dur <- NA
    df$dur[1]<-0 
    for(i in 2:nrow(df)){
    if(df$event[i]==0){
    df$dur[i] <- df$dur[i-1]+1
    }else{
    df$dur[i] <- 0
    }
    }
    print(df)

Однако я не могу найти аккуратное решение для этого. Я пытался использовать функцию накопления purrr, но это дает мне неправильный вывод

library(tidyverse)
df <- tibble(event = c(0,0,0,0,1,0,0,1,1,0,0,1))
df <- df %>% mutate(dur = case_when(event==1 ~ 0,
                        T~purrr::accumulate(event,~.x+1,.init=-1)[-1]))
print(df)

Любое предложение о том, как это сделать?

1 Ответ

1 голос
/ 16 октября 2019

Вот один из способов сделать это, захватив ваши группы через cumsum, когда event == 1, то есть

library(dplyr)

df %>% 
 group_by(grp = cumsum(event == 1)) %>% 
 mutate(dur = seq(n()) - 1)

which gives,
# A tibble: 12 x 3
# Groups:   grp [5]
   event   grp   dur
   <dbl> <int> <dbl>
 1     0     0     0
 2     0     0     1
 3     0     0     2
 4     0     0     3
 5     1     1     0
 6     0     1     1
 7     0     1     2
 8     1     2     0
 9     1     3     0
10     0     3     1
11     0     3     2
12     1     4     0

ПРИМЕЧАНИЕ: Выможно ungroup и убрать столбец grp в конце, если вам нравится

...