#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
которая не разрешает или не удаляет атрибуты.