Разница во времени в последовательных строках

#r

#r

Вопрос:

У меня есть этот df

 date;ind;code;inf
01/01/2017;CM109;CM;A
01/02/2019;CM109;CM;A
01/11/2019;CM109;CM;A
01/02/2020;CM114;CM;A
01/03/2020;CM114;CM;A
01/05/2018;CM121;CM;A
01/02/2020;CM121;CM;A
01/01/2017;CM129;CM;A
01/02/2018;CM129;CM;A
01/04/2018;CM129;CM;A
01/04/2018;CM129;CM;A
01/04/2018;CM129;CM;A
01/04/2018;CM129;CM;A
  

Я хочу рассчитать месячный интервал между последовательными датами для каждого кода.

Я сделал

 df$mes_ano <- as.Date(df$mes_ano, format = "%d/%m/%Y")

df <- df %>%
  group_by(code) %>%
  mutate(diff = strptime(mes_ano, "%d/%m/%Y") - lag(strptime(mes_ano, "%d/%m/%Y"), default = strptime(mes_ano, "%d/%m/%Y") [1]))
  

Но новый столбец имеет только NA

Комментарии:

1. Можете ли вы предоставить данные в воспроизводимом формате, используя dput(df) ? Если ваши данные слишком большие или содержат много столбцов, вы можете подмножество, а затем разделить dput , т.е. dput(df[1:15,1:5]) для 15 строк и 5 столбцов. Также показывает ожидаемый результат для совместно используемых данных.

Ответ №1:

‘mes_ano’ уже преобразован в Date класс (на основе данных столбец называется ‘date’). Итак, strptime с format помощью не будет работать. Вместо strptime , лучше использовать as.POSIXct и без использования первого преобразования в Date класс

 library(dplyr)
df %>%
    mutate(date = as.POSIXct(date, format = '%d/%m/%Y')) %>%
    group_by(code) %>%
    mutate(diff = date - lag(date, default = first(date)))
  

-вывод

 # A tibble: 13 x 5
# Groups:   code [1]
#   date                ind   code  inf   diff          
#   <dttm>              <chr> <chr> <chr> <drtn>        
# 1 2017-01-01 00:00:00 CM109 CM    A             0 secs
# 2 2019-02-01 00:00:00 CM109 CM    A      65750400 secs
# 3 2019-11-01 00:00:00 CM109 CM    A      23583600 secs
# 4 2020-02-01 00:00:00 CM114 CM    A       7952400 secs
# 5 2020-03-01 00:00:00 CM114 CM    A       2505600 secs
# 6 2018-05-01 00:00:00 CM121 CM    A     -57891600 secs
# 7 2020-02-01 00:00:00 CM121 CM    A      55386000 secs
# 8 2017-01-01 00:00:00 CM129 CM    A     -97286400 secs
# 9 2018-02-01 00:00:00 CM129 CM    A      34214400 secs
#10 2018-04-01 00:00:00 CM129 CM    A       5094000 secs
#11 2018-04-01 00:00:00 CM129 CM    A             0 secs
#12 2018-04-01 00:00:00 CM129 CM    A             0 secs
#13 2018-04-01 00:00:00 CM129 CM    A             0 secs
  

для лучшего управления блоками используйте difftime

 df %>%
    mutate(date = as.POSIXct(date, format = '%d/%m/%Y')) %>%
    group_by(code) %>%
    mutate(diff = difftime(date, lag(date, default = first(date)), unit = 'days'))
  

-вывод

 # A tibble: 13 x 5
# Groups:   code [1]
#   date                ind   code  inf   diff            
#   <dttm>              <chr> <chr> <chr> <drtn>          
# 1 2017-01-01 00:00:00 CM109 CM    A         0.00000 days
# 2 2019-02-01 00:00:00 CM109 CM    A       761.00000 days
# 3 2019-11-01 00:00:00 CM109 CM    A       272.95833 days
# 4 2020-02-01 00:00:00 CM114 CM    A        92.04167 days
# 5 2020-03-01 00:00:00 CM114 CM    A        29.00000 days
# 6 2018-05-01 00:00:00 CM121 CM    A      -670.04167 days
# 7 2020-02-01 00:00:00 CM121 CM    A       641.04167 days
# 8 2017-01-01 00:00:00 CM129 CM    A     -1126.00000 days
# 9 2018-02-01 00:00:00 CM129 CM    A       396.00000 days
#10 2018-04-01 00:00:00 CM129 CM    A        58.95833 days
#11 2018-04-01 00:00:00 CM129 CM    A         0.00000 days
#12 2018-04-01 00:00:00 CM129 CM    A         0.00000 days
#13 2018-04-01 00:00:00 CM129 CM    A         0.00000 days
  

данные

 df <- structure(list(date = c("01/01/2017", "01/02/2019", "01/11/2019", 
"01/02/2020", "01/03/2020", "01/05/2018", "01/02/2020", "01/01/2017", 
"01/02/2018", "01/04/2018", "01/04/2018", "01/04/2018", "01/04/2018"
), ind = c("CM109", "CM109", "CM109", "CM114", "CM114", "CM121", 
"CM121", "CM129", "CM129", "CM129", "CM129", "CM129", "CM129"
), code = c("CM", "CM", "CM", "CM", "CM", "CM", "CM", "CM", "CM", 
"CM", "CM", "CM", "CM"), inf = c("A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A")), class = "data.frame",
row.names = c(NA, 
-13L))
  

Комментарии:

1. Я получаю эту ошибку Ошибка в x[[n]]: объект типа ‘closure’ не поддается подстановке

2. @NevsBia основано ли это на тех же «данных» в моем сообщении. Я не смог получить ошибку, основанную на этом

3. Я работал с df %>% group_by(code) %>% mutate(разница = задержка даты (дата, по умолчанию = первая (дата)))