2016-02-26 21 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

as @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()將把這些值作爲起源以來的天數,但是你沒有提供一個起源來根據它來計算。