Ошибка со «стандартной однозначной датой» для преобразования строки в дату в R

Итак, я пробую этот код, который я использовал в прошлом с другими задачами обработки данных без ошибок:

## Create an age_at_enrollment variable, based on the start_date per individual (i.e. I want to know an individual's age, when they began their healthcare job).

complete_dataset_1 = complete_dataset %>% mutate(age_at_enrollment = (as.Date(start_date)-as.Date(birth_date))/365.25)

Однако я продолжаю получать это сообщение об ошибке: «Ошибка в charToDate (x): строка символов не имеет стандартного однозначного формата»

Я считаю, что эта ошибка возникает из-за того, что в наборе административных данных, который я использую, переменные start_date иbirth_date имеют странный формат:

start_date    birth_date
2/5/07 0:00   2/28/1992 0:00

Я не смог найти ответ на вопрос, почему данные отформатированы таким образом, так что какие-нибудь мысли о том, как решить эту проблему, не изменяя исходный набор административных данных?


person maldini425    schedule 22.03.2020    source источник


Ответы (1)


Неоднозначность в вашем вызове as.Date заключается в том, идет ли день или месяц первым. Чтобы решить эту проблему, вы можете использовать параметр format для as.Date:

complete_dataset_1 = complete_dataset
    %>% mutate(age_at_enrollment = (
        as.Date(start_date, format="%m/%d/%Y") -
        as.Date(birth_date, format="%m/%d/%Y")) / 365.25)

Более точным способом вычисления разницы в годах, обрабатывая крайний случай високосного года, было бы использование пакета lubridate:

library(lubridate)
complete_dataset_1 = complete_dataset
    %>% mutate(age_at_enrollment = time_length(difftime(
        as.Date(start_date, format="%m/%d/%Y"),
        as.Date(birth_date, format="%m/%d/%Y")), "years")
person Tim Biegeleisen    schedule 22.03.2020
comment
Большое спасибо! Однако мне любопытно, я ищу только возрастную переменную, которая говорит мне, является ли человек 25-летним, 26-летним, 27-летним и т. д. Каков наилучший способ разделить разницу между двумя столбцами? Потому что прямо сейчас созданная мной переменная age сообщает мне возраст наблюдения в днях, что является более подробным, чем то, что я ищу. - person maldini425; 22.03.2020
comment
Подсчитать точную разницу в годах сложно. Пакет lubridate предлагает способ сделать это, см. здесь. - person Tim Biegeleisen; 22.03.2020