Функция R, чтобы дать группе все предыдущие даты, когда возникает условие - PullRequest
1 голос
/ 07 ноября 2019

Мой код написан на R, где у меня есть таблица, состоящая из 3 переменных: даты, идентификатора и пути. Таблица сортируется сначала по идентификатору, а затем по дате. Когда путь равен 0, мне нужно сгруппировать все предыдущие номера пути для этого идентификатора в одну строку и зарегистрировать первую дату (Data_Start) и данные, где Path = 0 (Date_End). Это должно быть сделано для каждого идентификатора.

Например, вторая строка в требуемой таблице результатов: путь = 0 произошел 2018-10-08 для идентификатора 5, что означает, что все пути предыдущих дат должны быть сгруппированы вместе как путь = 1,0,3,4, Data_Start = 2018-10-05 и Data_End = 2018-10-08.

Исходная таблица

Date        ID   Path
2018-10-05  5    1
2018-10-06  5    0
2018-10-07  5    3
2018-10-08  5    0
2018-10-06  5    4
2018-10-08  7    5
2018-10-07  8    2
2018-10-08  8    1
2018-10-09  8    0

Желаемый результат:

Date_Start    Date_End          ID   Index  Path
2018-10-05    2018-10-06        5    1      1,0
2018-10-05    2018-10-08        5    2      1,0,3,0
2018-10-06    2018-10-06        5    3      4
2018-10-08    2018-10-08        7    4      5
2018-10-07    2018-10-09        8    5      2,1,0

Заранее спасибо!

1 Ответ

0 голосов
/ 08 ноября 2019

Наряду с ID мы можем создать еще одну группу, в которой Path станет 0, получим first и last Date каждой группы. Чтобы получить все предыдущие Path числа, мы проверяем, заканчивается ли последнее значение 0, а также replace их Date_Start значением first.

library(dplyr)

df %>%
   group_by(ID) %>%
   mutate(group = lag(cumsum(Path == 0), default = 0)) %>%
   group_by(ID, group) %>%
   summarise(Date_Start = first(Date), 
             Date_End = last(Date), 
             Path = toString(Path)) %>%
   mutate(Path = paste_values(Path), 
          Date_Start = replace(Date_Start,endsWith(Path,"0"),first(Date_Start))) %>%
    ungroup %>%
    dplyr::select(-group) %>%
    mutate(Index = row_number())

#    A tibble: 5 x 5
#     ID Date_Start Date_End   Path       Index
#  <int> <fct>      <fct>      <chr>      <int>
#1     5 2018-10-05 2018-10-06 1, 0           1
#2     5 2018-10-05 2018-10-08 1, 0, 3, 0     2
#3     5 2018-10-06 2018-10-06 4              3
#4     7 2018-10-08 2018-10-08 5              4
#5     8 2018-10-07 2018-10-09 2, 1, 0        5

, где я определяю функцию paste_valuesкак

paste_values <- function(value) {
  sapply(seq_along(value), function(x) {
     if (endsWith(value[x], "0")) toString(value[1:x])
     else value[x]
   })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...