Ошибки, обусловливающие новое поле даты другим полем даты

#r #date

#r #Дата

Вопрос:

Я пытаюсь создать новое поле даты на основе двух других столбцов. Если ‘R’ присутствует в столбце индикатора, я хочу, чтобы дата была датой отчета. Если ‘R’ отсутствует, я хочу, чтобы дата была IncidentDate . Рабочий пример:

 IncidentDate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
ReportDate <- as.Date(c('2010-11-1','2008-5-25','2007-5-14'))
Indicator <- c('','R','')

incident_data <- data.frame(IncidentDate, ReportDate, Indicator)

typeof(IncidentDate) #double


incident_data$calculatedDate <- ifelse(incident_data$ReportDate=='R',as.Date(incident_data$ReportDate), as.Date(incident_data$IncidentDate))
 

Это выдает ошибку:

 Error in charToDate(x) : 
  character string is not in a standard unambiguous format
 

Я также пробовал:

 incident_data$calculatedDate <- ifelse(incident_data$ReportDate=='R',as.Date(as.character(incident_data$ReportDate)), as.Date(as.character(incident_data$IncidentDate)))
 

Что дает мне ту же ошибку. Почему это может происходить?

Ответ №1:

В base R , может быть, лучше использовать присваивание для логического вектора, а ifelse не для Date класса, поскольку ifelse это может принудительно и удалить Date атрибут.

 i1 <- incident_data$Indicator=='R'
incident_data$calculatedDate <- incident_data$IncidentDate
incident_data$calculatedDate[i1] <- incident_data$ReportDate
 

Логическое должно основываться на Indicator столбце. Однако ifelse принудительно Date возвращает его к целочисленному режиму хранения. Поэтому, возможно, лучше использовать if_else или case_when . С if_else помощью , case_when , выполняется проверка типа, связанная со true false случаями.

 library(dplyr)
if_else(incident_data$Indicator=='R',as.Date(incident_data$ReportDate), 
     as.Date(incident_data$IncidentDate))
#[1] "2010-11-01" "2008-05-25" "2007-03-14"
 

Комментарии:

1. ты человек akrun. Но можете ли вы объяснить, почему if_else работает, а ifelse нет? Единственное отличие в том, что ifelse пытается принудительно преобразовать в целое число, а if_else — нет?

2. @Diamondjoe 12 Это одна из особенностей исходного кода, ifelse которая не разрешает или не удаляет атрибуты.