Группировать двоичные данные в R - PullRequest
0 голосов
/ 25 октября 2019

Я играю с двоичными данными.

У меня есть тестовые данные в столбцах следующим образом:

       A   B   C   D   E   F   G   H   I   J   K   L   M   N
       -----------------------------------------------------
       1   1   1   1   1   1   1   1   1   0   0   0   0   0
       0   0   0   0   1   1   1   0   1   1   0   0   1   0

1 isпоказывая, что система была включена, и 0, указывая, что система была выключена.

У меня есть способ найти способ суммировать разрывы между вкл / выкл переход этих систем.

Например:

  • для первого ряда, перестает работать после I

  • для второго ряда, он работает с E до G, а затем снова работает в I и M, но выключается во время других.

Я вижу свой результат в следующей форме (table1)

    row-number   value      grp_num     num       Range
    ------------  -----     --------    ------    ------ 
    1              1           1          9         A-I
    1              0           2          5         J-N
    2              0           1          4         A-D
    2              1           2          3         E-G
    2              0           3          1         H-H
    2              1           4          2         I-J
    2              0           5          2         K-L
    2              1           6          1         M-M
    2              0           7          1         N-N

Я использовал следующий код:

table1 <- test[,-c(1)] %>% 
  rownames_to_column() %>%
  gather(col,val,-rowname) %>%
  group_by(rowname) %>%
  mutate(grp_num = cumsum(val != lag(val, default = -99))) %>%
  group_by(rowname,val,grp_num) %>%
  dplyr::summarise(num = n(),
                   range = paste0(first(col), "-", last(col)))

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

A   B   C   D   E   F   G   H   I   J   K   L   M   N
-----------------------------------------------------
    1   1   1   1   1   1   1   1   0   0   0   0   0
                1   1   1   0   1   1   0   0   1   0

Ожидаемый результат очень похож, но исключая пустые значения

         row-number   value      grp_num     num       Range
        ------------  -----     --------    ------    ------ 
        1              1           1          8         B-I
        1              0           2          5         J-N
        2              1           1          3         E-G
        2              0           2          1         H-H
        2              1           3          2         I-J
        2              0           4          2         K-L
        2              1           5          1         M-M
        2              0           6          1         N-N

...