У меня есть два столбца START и DATE, мне нужно рассчитать разницу между датами (в году, месяце и днях), а затем рассчитать среднее значение разницы (START-END). Спасибо за помощь. Этот вопрос не совпадает с другими вопросами, которые уже были опубликованы ранее.
Данные:
start end diff
"2020-5-16" "2029-7-15" 9 years, 2 months and etc
"2024-5-16" "2028-3-13"
"2023-4-17" "2025-4-12"
"2026-7-18" "2028-5-16"
star<-c("2020-5-16" , "2024-5-16" , "2023-4-17" , "2026-7-18")
end<-c( "2029-7-15", "2028-3-13","2025-4-12","2028-5-16")
data<-data.frame(star,end)
@ Бернхард, спасибо за ответ, к сожалению, я не смог получить ваш вопрос. Нужно ли мне добавлять больше информации в данные?
Вы можете использовать lubridate::as.period:
library(lubridate)
star<-c("2020-5-16" , "2024-5-16" , "2023-4-17" , "2026-7-18")
end<-c( "2029-7-15", "2028-3-13","2025-4-12","2028-5-16")
as.period(interval(as.Date(star), as.Date(end)))
#[1] "9y 1m 29d 0H 0M 0S" "3y 9m 26d 0H 0M 0S" "1y 11m 26d 0H 0M 0S" "1y 9m 28d 0H 0M 0S"
Вы можете использовать функцию difftime(), чтобы получить разницу между двумя датами в секундах. Используя пакет lubridate на языке R
@ MD Shahid Khan, спасибо за функцию answer.difftime(), которая просто выдает результаты либо в годах, либо в месяцах, либо в днях. Мне нужно получить разницу (например: 3 года, два месяца, 1 день), а затем рассчитать среднее значение.
@Маэль, большое спасибо за помощь. Всего один вопрос. Мне нужно рассчитать среднее значение всех этих различий. У меня есть две переменные, START и END, и после расчета разницы между датами мне нужно рассчитать среднее значение. Мне было интересно, как я могу это сделать.
mapply(function(x, y) as.period(interval(x, y)), START, END)
@ Maël, большое спасибо за ваше время, но эта функция работает неправильно. После расчета столбца diff мне нужно рассчитать среднее значение diff. Не могли бы вы проверить вопрос и изменить свой код.
См. редактирование, интервал векторизован, так что нет проблем
@ Маэль, спасибо, но мне нужно вычислить среднее значение этих различий. Я имею в виду что-то вроде среднего(как.период(интервал(как.Дата(звезда), как.Дата(конец))))
Вы можете сделать as.period(mean(interval(as.Date(star), as.Date(end)))), но вы получите секунды. Без контрольной точки вы не можете вычислить периоды, потому что годы имеют разную длину.
Это довольно сложный вопрос: разные месяцы имеют разную продолжительность, поэтому «3 года, два месяца, 2 дня» на самом деле не является четко определенным периодом времени. Должны ли мы подразумевать длину января или февраля для этого ответа?