2014-11-04 36 views
0
data <- data.frame(dates = c("2014-10-28 00:01:59.526","2014-10-27 13:30:01.526"), 
        times = c("23:59:59","13:29:55"), 
        hour = c(23,13), 
        minute = c(59,29), 
        second = c(59,55)) 
data[,1] <- as.POSIXct(data[,1]) 
data[,2] <- as.factor(data[,2]) 
class(data[,1]) 
class(data[,2]) 
class(data[,3]) 
class(data[,4]) 
class(data[,5]) 
     data 

        dates times hour minute second 
1 2014-10-28 00:01:59.526 23:59:59 23  59  59 
2 2014-10-27 13:30:01.526 13:29:55 13  29  55 

我需要填充新列「NewDate」與信息,但那裏的日期和時間列的組合POSIXct數據IF小時列顯示23那麼「NEwDate」的日期應該是從「日期」列減去1天后的日期,否則應該是「日期」列中的日期。R如果跨數據表的列語句來填充新列

所以最終的輸出應該是:

   date   time  hour minute second NewDate  
1 2014-10-28 00:01:59.526 23:59:59 23 59  59 2014-10-27 23:59:59 #NewDate = date-1 + time 
2 2014-10-27 13:30:01.526 13:29:55 13  29  55 2014-10-17 13:29:55 #NewDate = date + time 

(NewDate必須是一個POSIXct)

什麼是做到不循環下的數據幀,並做類似的最佳途徑:

library(lubridate) #lubridate contains hour(), minute(), second() 

CorrectTIME <- function(date, hour, minute, second) 
{ 
    NewDate<- vector("numeric",length(date)) 
    for(i in 1:length(date)) 
    { 
     if(hour[i] > hour(date[i])) 
     { 
      NewDate[i] =ISOdatetime(year(date[i]), month(date[i]), day(date[i])-1, hour[i], minute[i], second[i], tz="GMT") 
     }else 
     { 
      NewDate[i] =ISOdatetime(year(date[i]), month(date[i]), day(date[i]), hour[i], minute[i], second[i], tz="GMT") 
     } 
    } 

} 
+1

R有一個函數:'?ifelse' – shadowtalker 2014-11-04 17:56:39

+0

as.factor是多餘的。這已經是一個因素。 – 2014-11-04 21:17:12

回答

0
with(data, paste (format(as.Date(dates) - (hour == 23) , "%Y-%m-%d"), 
      paste(hour, minute, second, sep=":"))) 
#[1] "2014-10-27 23:59:59" "2014-10-27 13:29:55" 

哎呀,忘了as.POSIXct:

as.POSIXct(with(data, paste (format(as.Date(dates) - (hour==23) , 
      "%Y-%m-%d"), paste(hour, minute, second, sep=":")))) 
[1] "2014-10-27 23:59:59 PDT" "2014-10-27 13:29:55 PDT"