#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(разница = задержка даты (дата, по умолчанию = первая (дата)))