Как проверить, изменился ли объект в течение следующих 7 дней? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть два R data.frame, описывающих события изменения состояния определенных объектов.df1 - это совокупность всех x to y переходов состояний, а df2 содержит все y to anything переходы.Я хочу исключить все x to y переходы объекта, если за ним последовал любой y to anything переход в течение следующих 7 дней.Оба data.frame могут содержать несколько записей для object_id и state_change.Также объект может менять состояние несколько раз в день.Ниже приведен код для воспроизведения образцов входных данных.

df1 <- data.frame(object_id = c('a', 'b', 'a', 'd'), 
                  state_change = c('x to y', 'x to y', 'x to y', 'x to y'), 
                  event_date = c('2018-01-01', '2018-01-01', '2018-01-05', '2018-01-01'))

> df1
  object_id state_change event_date
1         a       x to y 2018-01-01
2         b       x to y 2018-01-01
3         a       x to y 2018-01-05
4         d       x to y 2018-01-01

> df2 <- data.frame(object_id = c('b', 'a', 'd'), 
                    state_change = c('y to z', 'y to x', 'y to z'), 
                    event_date = c('2018-01-01', '2018-01-03', '2018-01-15'))

> df2
  object_id state_change event_date
1         b       y to z 2018-01-01
2         a       y to x 2018-01-03
3         d       y to z 2018-01-15

Я бы хотел изменить df1 на следующий, поскольку для перехода object_id = d, x to y не последовал переход y to anything в следующем7 дней:

> df1
  object_id state_change event_date
1         d       x to y 2018-01-01

Я новичок в анализе временных рядов в R, и это кажется фундаментальным вопросом.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 19 октября 2018

После некоторых усилий придумали следующее решение.Не уверен, что я пропускаю какие-либо дела.

# combine all events, arrange by object_id and event date, mutate next event and next object
> df3 <- rbind(df1, df2) %>% 
      arrange(object_id, event_date) %>% 
      mutate(next_event = lead(event_date),
             next_object = lead(object_id))

# resulting dataframe containing all events
> df3
  object_id state_change event_date next_event next_object
1         a       x to y 2018-01-01 2018-01-05           a
2         a       x to y 2018-01-05 2018-01-03           a
3         a       y to x 2018-01-03 2018-01-01           b
4         b       x to y 2018-01-01 2018-01-01           b
5         b       y to z 2018-01-01 2018-01-01           d
6         d       x to y 2018-01-01 2018-01-15           d
7         d       y to z 2018-01-15       <NA>        <NA>


# remove all x to y changes which are followed by y to anything within next 7 days
> df1_filtered <- df3 %>% 
      filter(as.numeric(difftime(next_event,event_date, units = 'days')) > 7 |
             object_id != next_object | 
             is.na(next_object) | 
             is.na(as.numeric(difftime(next_event, event_date, units = 'days')))) %>% 
      filter(state_change == 'x to y')

# final result
> df1_filtered

  object_id state_change event_date next_event next_object
1         d       x to y 2018-01-01 2018-01-15           d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...