#r #dplyr
Вопрос:
У меня есть этот фрейм данных, с которым я работаю.
data lt;- data.frame(id = c(123,124,125,126,127,128,129,130), date = c("10/7/2021","10/6/2021","9/13/2021","10/18/2021","8/12/2021","9/6/2021","10/29/2021","9/6/2021"))
Моя цель-создать новый столбец, в котором будет указано, сколько дней прошло с этой зарегистрированной даты для каждой строки. Я пытаюсь использовать этот код, но в моей новой колонке все время появляются дни NA.
data %gt;% select(id,date) %gt;% mutate("days_since" = as.Date(Sys.Date()) - as.Date(date,format="%Y-%m-%d")) id date days_since 1 123 10/7/2021 NA days 2 124 10/6/2021 NA days 3 125 9/13/2021 NA days 4 126 10/18/2021 NA days 5 127 8/12/2021 NA days 6 128 9/6/2021 NA days 7 129 10/29/2021 NA days 8 130 9/6/2021 NA days
Что я делаю не так? Спасибо вам за любые отзывы.
Комментарии:
1. Указанный формат неверен; так и должно быть
as.Date(date,format="%m/%d/%Y")
. Тогда ваш код будет работать просто отлично.2. попробуй
Sys.Date() - as.Date(date, format = '%m/%d/%Y')
илиSys.Date() - lubridate::mdy(date)
Ответ №1:
Мы можем использовать lubridate
посылку. Это значительно упрощает преобразование типов и операции с датами. В вашем коде этот as.Date(date)
шаг был проблематичным, потому что формат был неправильным.
library(dplyr) library(lubridate) data %gt;% mutate("days_since" = Sys.Date() - mdy(date)) id date days_since 1 123 10/7/2021 28 2 124 10/6/2021 29 3 125 9/13/2021 22 4 126 10/18/2021 17 5 127 8/12/2021 23 6 128 9/6/2021 29 7 129 10/29/2021 6 8 130 9/6/2021 29
Спасибо, @Karthik S за упрощение
Комментарии:
1. Вам не нужно отдавать
day(Sys.Date() - day(mdy(date))
, простоSys.Date() - mdy(date)
достаточно2. Хм, хорошее предложение.
Ответ №2:
это также легко сделать, используя основание r и простое «-«. Это возвращает разницу в днях:
data lt;- data.frame(id = c(123,124,125,126,127,128,129,130), date = c("2021-10-10","2021-10-06","2021-09-13","2021-10-18","2021-08-12","2021-09-06","2021-10-29","2021-09-06")) data$date lt;- as.Date(data$date) data$sys_date lt;- Sys.Date() data$sysDate_to_date lt;- data$sys_date -data$date