Рассчитать время между особым случаем и двумя следующими последовательными датами - PullRequest
0 голосов
/ 10 октября 2018

Ниже у меня есть фрейм данных, и я хочу сначала найти позицию особого вхождения и рассчитать разницу во времени между этим особым вхождением (предупреждением) и двумя следующими последовательными элементами,

id     date         type
2      2015-03-01   a
3      2015-12-12   b
2      2015-01-05   Alert
2      2015-01-15   c
2      2015-01-01   d
2      2015-12-02   a
3      2015-12-02   Alert
3      2015-12-02   a
4      2015-12-02   b
3      2015-12-12   a
...

и ниже фрейма данныхожидается:

id     days_diffrence_1     days_difference_2
2      10                   55
3      0                    10
4      nan                  nan
... 

у меня есть попытка, но она не работает,

  table <- df %>% 
  group_by(id) %>%
  summarise(days_diffrence_1 = as.numeric(date[2] - date[1]),
            days_difference_2 = as.numeric(date[3] - date[1]))

Ответы [ 2 ]

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

Другой подход к тидиверсу / dplyr

пример данных

df <- read.table(text="id     date         type
2      2015-03-01   a
3      2015-12-12   b
2      2015-01-05   Alert
2      2015-01-15   c
2      2015-01-01   d
2      2015-12-02   a
3      2015-12-02   Alert
3      2015-12-02   a
4      2015-12-02   b
3      2015-12-12   a", header = TRUE, stringsAsFactor = FALSE)

код

library( tidyverse )

df %>% 
  #set date as Date-class
  mutate( date = as.Date( date ) ) %>%
  arrange( date ) %>%
  group_by( id ) %>%
  #calculate days to next event 
  mutate( days_diffrence_1 = ifelse( type == "Alert", lead( date, n = 1L, order_by = id ) - date, NA ),
          days_diffrence_2 = ifelse( type == "Alert", lead( date, n = 2L, order_by = id ) - date, NA ) ) %>%
  filter( !is.na( days_diffrence_1 ) )

результат

#      id date       type  days_diffrence_1 days_diffrence_2
#   <int> <date>     <chr>            <dbl>            <dbl>
# 1     2 2015-01-05 Alert               10               55
# 2     3 2015-12-02 Alert                0               10
0 голосов
/ 10 октября 2018

Мы можем использовать dplyr, group_by id, arrange их на date, получить индексы особого случая ("Alert"), если они присутствуют, и вычесть date из этого индекса с индексом следующегодва показателя.Если «Alert» отсутствует, мы возвращаем NA.

library(dplyr)

df %>%
   group_by(id) %>%
   arrange(date) %>%
   summarise(inds = if (any(type == "Alert")) which.max(type == "Alert") else NA,
        days_diffrence_1 = as.numeric(date[inds+1] - date[inds]), 
        days_diffrence_2 = as.numeric(date[inds+2] - date[inds])) %>%
   select(-inds)


#     id days_diffrence_1 days_diffrence_2
#  <int>            <dbl>            <dbl>
#1     2               10               55
#2     3                0               10
#3     4               NA               NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...