2016-10-17 2 views
2

Мой вопрос очень похож на тот, который представлен ниже, однако я хочу добавить дополнительную команду, чтобы возвращать только случаи, когда последовательность имеет более двух последовательных значений.Считайте последовательные значения в группах с условием с dplyr и rle

Как подсчитать количество последовательных «успехов» (т. Е. 1 в $ consec), когда заданная последовательность работает с более чем двумя последовательными числами в пределах данной эры и данного года?

Аналогичный вопрос: Summarize consecutive failures with dplyr and rle . Для сравнения, я изменил пример, использованный в этом вопросе:

library(dplyr) 
df <- data.frame(Era=c(1,1,1,1,1,1,1,1,1,1),Year = c(1,2,2,3,3,3,3,3,3,3), consec = c(0,0,1,0,1,1,0,1,1,1)) 

df %>% 
    group_by(Era,Year) %>% 
    do({tmp <- with(rle(.$consec==1), lengths[values]) 
     data.frame(Year= .$Year, Count=(length(tmp)))}) %>% 
    slice(1L) 

> Source: local data frame [3 x 3] 
> Groups: Era, Year 

> Era Year Count 
> 1 1 1  0 
> 2 1 2  1 
> 3 1 3  2 
> 

Все, что мне теперь нужно добавить условие, чтобы включать только случаи последовательных чисел в последовательности> 2. Желаемый результат:

> Source: local data frame [3 x 3] 
> Groups: Era, Year 

> Era Year Count 
> 1 1 1  0 
> 2 1 2  0 
> 3 1 3  1 

Любые советы были бы весьма признательны.

ответ

2

Нам нужно создать логический индекс с lengths и получить sum его

df %>% 
    group_by(Era, Year) %>% 
    do({ tmp <- with(rle(.$consec), sum(lengths > 2)) 
    data.frame(Count = tmp)}) 
# Era Year Count 
# <dbl> <dbl> <int> 
#1  1  1  0  
#2  1  2  0 
#3  1  3  1 
Смежные вопросы