Интервальные числа в матрице - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть фрейм данных с 3523 наблюдениями и 92 переменными.

Ниже приведен пример фрейма данных с 6; 24-часовая запись наблюдений начинается в 4:00 утра и заканчивается в 4:00 утра.

  04:00   04:15   04:30 05:00  ...  04:35
1  -       -     -       -     ...  -
2  2       2     2       -     ...  -
3  2       -     -       2     ...  -
4  -       -     2       -     ...  -
5  -       -     -       -     ...  -
6  -       -     -       -     ...  2 

Каждая строка содержит значения «-» и «2».

Я хочу извлечь начало и конец интервалов, начинающихся с: '2'

For example 2: 04:15-04:30; 
            3: 04:00 ; 05:00
            4: 04:30 

Спасибо

1 Ответ

0 голосов
/ 11 ноября 2018

Давайте немного расширим ваш пример. В расширенном примере мы можем заметить, что для строки № 1 нет 2, а также есть несколько более хитрых, как, например, в строке 6, где у нас есть 2, затем разрыв (-) после этого последовательность из двух 2 s, a - и a 2 снова.

    04:00 04:15 04:30 05:00 05:15 05:30
 1:     -     -     -     -     -     -
 2:     2     2     2     -     2     2
 3:     2     -     -     2     2     2
 4:     -     -     2     -     2     2
 5:     -     -     -     -     2     2
 6:     2     -     2     2     -     2
 7:     -     -     -     -     2     2
 8:     2     2     -     2     2     2
 9:     -     -     -     -     2     2
10:     2     2     -     2     2     2

Вы можете воспроизвести его, набрав:

WorkSchedulesDay1 <- structure(list(`04:00` = c("-", "2", "2", "-", "-", "2", "-", 
"2", "-", "2"), `04:15` = c("-", "2", "-", "-", "-", "-", "-", 
"2", "-", "2"), `04:30` = c("-", "2", "-", "2", "-", "2", "-", 
"-", "-", "-"), `05:00` = c("-", "-", "2", "-", "-", "2", "-", 
"2", "-", "2"), `05:15` = c("-", "2", "2", "2", "2", "-", "2", 
"2", "2", "2"), `05:30` = c("-", "2", "2", "2", "2", "2", "2", 
"2", "2", "2")), row.names = c(NA, -10L), class = c("data.table", 
"data.frame"))

После этого вы применяете код:

WorkSchedulesDay1 <- WorkSchedulesDay1 %>% 
  group_by(rn = row_number()) %>% 
  gather(time, val, 1:6) %>%
  arrange(time) %>%
  mutate(tmp = cumsum(coalesce(val != lag(val), FALSE))) %>% arrange(rn) %>%
  filter(!val == "-") %>%
  group_by(rn, tmp) %>%
  mutate(
    time = case_when(
      n() > 1 ~ paste(min(time), max(time), sep = " - "),
      TRUE ~ time
    )
  ) %>%
  ungroup() %>% distinct(rn, tmp, time) %>%
  group_by(rn) %>%
  mutate(
    intervals = case_when(
      n() > 1 ~ paste(time, collapse = ", "),
      TRUE ~ time
    )
  ) %>% distinct(rn, intervals) %>%
  write_csv("WorkSchedulesDay1.csv")

Вы увидите, что вы получаете:

     rn intervals                   
  <int> <chr>                       
     2 04:00 - 04:30, 05:15 - 05:30
     3 04:00, 05:00 - 05:30        
     4 04:30, 05:15 - 05:30        
     5 05:15 - 05:30               
     6 04:00, 04:30 - 05:00, 05:30 
     7 05:15 - 05:30               
     8 04:00 - 04:15, 05:00 - 05:30
     9 05:15 - 05:30               
    10 04:00 - 04:15, 05:00 - 05:30

Нет записи для строки № 1, просто потому что там только -.

Аналогично, в строке № 2 нет записи для 05:00 просто потому, что там есть -.

Аналогичным образом, есть 04:00, 04:30 - 05:00, 05:30 для строки № 6, потому что есть - для 04:15 и 05:15.

...