2016-02-26 2 views
3

Итак, у меня есть эта очень странная ситуация. С R и преобразованием даты с функцией as.Date(). Самое странное, что инструкция ifelse не работает, поскольку она должна работать.R dplyr mutate не работает с as.Date (NA) 'origin' должно быть поставлено

Так ситуация:

Я хочу, чтобы извлечь дату из числа, но застрял на тех ситуациях, когда происходит NA. Если я применяю as.Date (NA), я не получаю никаких ошибок. Но странные вещи начинаются с dataFrames.

Вот пример:

###### create temp data.frame 
t1 <- data.frame(dateNum = c(6000,6001,NA)) 

##### First attempt: straight ############ 
t2 <- t1 %>% dplyr::mutate(
    dateConverted = as.Date(dateNum) 
) 

##### Second attempt: ifelse statement ############ 
t2 <- t1 %>% mutate(
    dateConverted = ifelse(is.na(dateNum),NA,as.Date(dateNum)) 
) 

##### Third attempt: ifelse statement for number 6000 ############ 
t2 <- t1 %>% mutate(
    naValue = is.na(dateNum), 
    dateFixed = ifelse(naValue,6000,dateNum), 
    dateConverted = ifelse(naValue,NA,as.Date(dateFixed)) 
) 

А вот выход. С ошибками «происхождения» должны быть поставлены

> ###### create temp data.frame 
> t1 <- data.frame(dateNum = c(6000,6001,NA)) 
> 
> ##### First attempt: straight ############ 
> t2 <- t1 %>% dplyr::mutate(
+  dateConverted = as.Date(dateNum) 
+) Error in as.Date.numeric(c(6000, 6001, NA)) : 'origin' must be supplied 
> 
> ##### Second attempt: ifelse statement ############ 
> t2 <- t1 %>% mutate(
+  dateConverted = ifelse(is.na(dateNum),NA,as.Date(dateNum)) 
+) Error in as.Date.numeric(c(6000, 6001, NA)) : 'origin' must be supplied 
> 
> ##### Third attempt: ifelse statement for number 6000 ############ 
> t2 <- t1 %>% mutate(
+  naValue = is.na(dateNum), 
+  dateFixed = ifelse(naValue,6000,dateNum), 
+  dateConverted = ifelse(naValue,NA,as.Date(dateFixed)) 
+) Error in as.Date.numeric(c(6000, 6001, 6000)) : 'origin' must be supplied 
> 
+1

как @Kara Woo сказал, что источник происхождения и ваш код будут работать, например: 't1%>% mutate (dateNum = as.Date (dateNum, origin =" 2000-12-31 "))' – count

+0

Да Вы верный. Это была моя ошибка. – aeliv002

ответ

21

Проблема заключается не в NA или dplyr, это с числовыми данными. От ?as.Date:

«as.Date» будет принимать числовые данные (количество дней с в эпоху), но только если «происхождение» поставляется.

Вы передаете числовые значения функции (6000 и 6001), но нет информации о том, что они представляют. as.Date() будет обрабатывать эти значения как количество дней с момента возникновения, но вы не указали источник для его расчета на основе.