Самый длинный последовательный счет одного и того же значения в группе - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть data.frame, как показано ниже, и я хочу добавить переменную, описывающую самый длинный последовательный счет 1 в переменной VALUE, наблюдаемой в группе (то есть самые длинные последовательные строки с 1 в VALUE на группу).

GROUP_ID    VALUE
    1         0
    1         1
    1         1
    1         1
    1         1
    1         0
    2         1
    2         1
    2         0
    2         1
    2         1
    2         1
    3         1
    3         0
    3         1
    3         0

Таким образом, результат будет выглядеть следующим образом:

GROUP_ID    VALUE    CONSECUTIVE
    1         0           4
    1         1           4
    1         1           4
    1         1           4
    1         1           4
    1         0           4
    2         1           3
    2         1           3
    2         0           3
    2         1           3
    2         1           3
    2         1           3
    3         1           1
    3         0           1
    3         1           1
    3         0           1

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Используя :

library(dplyr)
dat %>% 
  group_by(GROUP_ID) %>% 
  mutate(CONSECUTIVE = {rl <- rle(VALUE); max(rl$lengths[rl$values == 1])})

, что дает:

# A tibble: 16 x 3
# Groups:   GROUP_ID [3]
   GROUP_ID VALUE CONSECUTIVE
      <int> <int>       <int>
 1        1     0           4
 2        1     1           4
 3        1     1           4
 4        1     1           4
 5        1     1           4
 6        1     0           4
 7        2     1           3
 8        2     1           3
 9        2     0           3
10        2     1           3
11        2     1           3
12        2     1           3
13        3     1           1
14        3     0           1
15        3     1           1
16        3     0           1

Или с :

library(data.table)
setDT(dat)            # convert to a 'data.table'

dat[, CONSECUTIVE := {rl <- rle(VALUE); max(rl$lengths[rl$values == 1])}
    , by = GROUP_ID][]
0 голосов
/ 07 декабря 2018

Вот еще один вариант с data.table

library(data.table)
library(dplyr)
setDT(df1)[, CONSECUTIVE := max(table(na_if(rleid(VALUE)*VALUE, 0))), .(GROUP_ID)]
df1
#    GROUP_ID VALUE  CONSECUTIVE
# 1:        1     0            4
# 2:        1     1            4
# 3:        1     1            4
# 4:        1     1            4
# 5:        1     1            4
# 6:        1     0            4
# 7:        2     1            3
# 8:        2     1            3
# 9:        2     0            3
#10:        2     1            3
#11:        2     1            3
#12:        2     1            3
#13:        3     1            1
#14:        3     0            1
#15:        3     1            1
#16:        3     0            1

data

df1 <- structure(list(GROUP_ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
 2L, 2L, 2L, 3L, 3L, 3L, 3L), VALUE = c(0L, 1L, 1L, 1L, 1L, 0L, 
1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA, 
 -16L))
0 голосов
/ 07 декабря 2018

Мы можем использовать ave с rle и получить максимальное число последовательных 1 для каждой группы.(GROUP_ID)

df$Consecutive <- ave(df$VALUE, df$GROUP_ID, FUN = function(x) {
      y <- rle(x == 1)
      max(y$lengths[y$values])
})

df
#   GROUP_ID VALUE Consecutive
#1         1     0           4
#2         1     1           4
#3         1     1           4
#4         1     1           4
#5         1     1           4
#6         1     0           4
#7         2     1           3
#8         2     1           3
#9         2     0           3
#10        2     1           3
#11        2     1           3
#12        2     1           3
#13        3     1           1
#14        3     0           1
#15        3     1           1
#16        3     0           1
...