Как вычесть столбец значений даты с помощью sys.Date() с помощью mutate — tidyverse/dplyr? R

#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