Создание последовательности с использованием data.table :: rleid с исключением некоторых строк на основе дополнительного условия - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу создать последовательность последующих идентичных значений, как data.table::rleid. Но проблема в том, что я хочу, чтобы некоторые строки были исключены из последовательности, и какие строки должны быть исключены, может быть определен другим столбцом. Я понял, что data.table::rleid можно использовать дважды, но он все равно не дает идеального результата - см. Ниже:

my_example <- structure(list(event = c(234, 234, 224, 232, 232, 201, 201, 201, 
201, 201, 201, 201, 244, 244, 201, 201, 201, 244, 244, 212, 201, 
201, 201, 249, 201, 201, 201, 201, 201, 201, 201, 249, 201, 201, 
244, 244, 201, 261, 245, 203, 204, 204, 201, 201, 201, 201, 201, 
201, 216, 201), subgroup = c(10L, 11L, 10L, 10L, 11L, 10L, 10L, 
10L, 10L, 10L, 10L, 11L, 11L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 
10L, 11L, 11L, 11L, 11L, 11L, 11L, 10L, 11L, 11L, 11L, 10L, 10L,  
10L, 10L, 11L, 11L, 10L, 11L, 10L, 10L, 11L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 11L)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -50L), .Names = c("event", "subgroup"))

my_example %>% 
  mutate(in_seq = ! event %in% c(224, 232, 234, 261), 
         seq = data.table::rleid(subgroup) * in_seq,
         seq2 = data.table::rleid(seq))

# A tibble: 50 x 5
    event subgroup in_seq   seq  seq2
    <dbl>    <int> <lgl>  <int> <int>
 1   234       10 F          0     1
 2   234       11 F          0     1
 3   224       10 F          0     1
 4   232       10 F          0     1
 5   232       11 F          0     1
 6   201       10 T          5     2
 7   201       10 T          5     2
 8   201       10 T          5     2
 9   201       10 T          5     2
10   201       10 T          5     2
# ... with 40 more rows

Как я могу исключить некоторые строки из нумерации? (В приведенном выше примере это будет означать, что строки 1: 5, а также строка 38 будут иметь NA в seq2)

1 Ответ

0 голосов
/ 04 сентября 2018

Если мы хотим изменить значения в 's2' на NA

library(data.table)
my_example %>% 
  mutate(in_seq = ! event %in% c(224, 232, 234, 261), 
         s1 = rleid(subgroup * in_seq), 
         s2 = rleid(s1) * NA ^ !in_seq)

Или, если 's2' должен начинаться с '1', пропуская FALSE в 'in_seq'

my_example %>% 
   mutate(in_seq = ! event %in% c(224, 232, 234, 261), 
      s1 = data.table::rleid(subgroup) * in_seq, 
      s2 = (NA^!s1) * s1,
      s2 = match(s2, unique(na.omit(s2))))

Или это может быть

setDT(my_example)[, in_seq := !event %in% c(224, 232, 234, 261)
      ][, s1 := rleid(subgroup) * in_seq
       ][s1 != 0, s2 := rleid(s1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...