2015-08-14 30 views
0

我的代碼中有一系列日期在ifelse語句中,它們返回的是單個數值而不是日期。ifelse聲明返回數字而不是日期

osa <- read.delim("C:/RMathew/RScripts/osaevents/osaevents.txt", stringsAsFactors=TRUE) 
# 
osa$datetime <- ymd_hms(osa$datetime) 
osa$date <- as.Date(osa$datetime) 
sixoclock <- 6*60*60 
osa$daystart <- ymd_hms(ymd(osa$date) + sixoclock) 
osa$dateplus <- osa$date + 1 
osa$dateminus <- osa$date - 1 
osa$dayend <- ymd_hms(ymd(osa$dateplus) + sixoclock) 
osa$dateloca <- osa$datetime >= osa$daystart 
osa$datelocb <- osa$datetime < osa$dayend 
osa$milldate <- ifelse(osa$dateloca==TRUE & osa$datelocb==TRUE, 
         osa$date,osa$dateminus) 

該數據的起源地考慮從任何一天的早晨6點到第二天早上6點之間的時間,如同一天。上面的代碼嘗試將日期與特定日期上午6點之後的問題進行比較,但是在第二天上午6點之前將其分配給前一天的日期(無論它可能是哪一天)。

到目前爲止好,但它返回osa $ milldate的單個數字而不是ifelse列中的日期。

'data.frame': 897 obs. of 16 variables: 
$ datetime : POSIXct, format: "2015-08-13 15:11:53" "2015-08-13 14:53:26" "2015-08-13 14:34:58" "2015-08-13 14:16:18" ... 
$ stream : Factor w/ 1 level "fc": 1 1 1 1 1 1 1 1 1 1 ... 
$ fe  : num 18.1 18 17.6 18.1 18.5 ... 
$ ni  : num 2.97 2.99 2.92 3.2 3.32 ... 
$ cu  : num 3.41 3.35 2.99 3.58 3.73 ... 
$ pd  : num 138 157 139 166 183 ... 
$ mg  : num 13.8 13.8 14.4 14.3 13.9 ... 
$ so  : num 9.67 9.81 9.65 10.58 11.37 ... 
$ date  : Date, format: "2015-08-13" "2015-08-13" "2015-08-13" "2015-08-13" ... 
$ daystart : POSIXct, format: "2015-08-13 06:00:00" "2015-08-13 06:00:00" "2015-08-13 06:00:00" "2015-08-13 06:00:00" ... 
$ dateplus : Date, format: "2015-08-14" "2015-08-14" "2015-08-14" "2015-08-14" ... 
$ dateminus: Date, format: "2015-08-12" "2015-08-12" "2015-08-12" "2015-08-12" ... 
$ dayend : POSIXct, format: "2015-08-14 06:00:00" "2015-08-14 06:00:00" "2015-08-14 06:00:00" "2015-08-14 06:00:00" ... 
$ dateloca : logi TRUE TRUE TRUE TRUE TRUE TRUE ... 
$ datelocb : logi TRUE TRUE TRUE TRUE TRUE TRUE ... 
$ milldate : num 16660 16660 16660 16660 16660 ... 

想法?此外,可能會有更優雅的方式來做到這一點。

回答

3

查看幫助文件ifelse

警告:

結果的模式可以取決於「測試」(見 例子)的值,和類屬性(請參閱'oldClass')結果 取自'test',對於從'yes'和'no'中選擇的值 可能不合適。

有時它是更好地使用這種結構的

(tmp <- yes; tmp[!test] <- no[!test]; tmp) 

,可能延長「測試」處理缺失值。

這正是在您的例子回事介紹 - 日期類屬性丟失 - 和周圍的工作 - 一個多步驟方法。

osa$milldate <- osa$date 
ind<- osa$dateloca==TRUE & osa$datelocb==TRUE 
osa$milldate[!ind] <- osa$dateminus 

另一種選擇是replace

+0

我是這樣的R noob。我甚至無法理解這種結構。如果你能騰出時間,請把它翻譯成更簡單的形式,以便我能理解它? 我知道ifelse正在剝離日期格式。我想不出如何重寫這個ifelse聲明。這就是我正在努力的。 –

+0

您的示例已被翻譯爲多步驟方法。 –

+0

我不會打擾重寫'ifelse'語句。在它後面添加另一行。 'osa $ milldate < - as.POSIXct(osa $ milldate,origin = origin)'(原始對象位於'lubridate'包中)....或者你可能需要'as.Date',這取決於什麼你最初的目標是。 – Benjamin

0

A.韋伯讓我走上正確的道路。 ifelse班正在剝離日期格式的答案。上面的索引解決方案由於某種原因似乎混亂了日期順序。正如A. Webb指出的那樣,在幫助文件中,以下行立即修復了它。

class(osa$milldate) <- class(osa$date)

相關問題