2011-02-15 121 views
1

我試圖在R中編寫一個優雅的函數來計算兩個時間戳之間的經過時間,這兩個時間戳以格式hmm或HHMM。我想以整數分鐘的形式返回已用時間。R:計算兩個數字時間之間的時間間隔,例如944和1733爲469分鐘

這裏是我的解決方案,到目前爲止,這大概可以大大提高:

#Treatment of varous length inputs: 
#1 digit = m 
#2 digits = mm 
#3 digits = hmm 
#4 digits = hhmm 
#5+ digits = failure 

elapsedtime <- function(S,E) { 
    S<-c(as.character(S)) 
    E<-c(as.character(E)) 

    if (length(S)!=length(E)) { 
     stop("Invalid input") 
    } 

    for (i in seq(1:length(S))) { 
     if (nchar(S[i])>4) {S[i]<-NA} 
     if (nchar(E[i])>4) {E[i]<-NA} 

     while (nchar(S[i])<4) { 
      S[i]<-paste('0',S[i],sep='') 
     } 

     while (nchar(E[i])<4) { 
      E[i]<-paste('0',E[i],sep='') 
     } 
     S[i]<-as.character(as.numeric(substr(S[i],1,2))*60+as.numeric(substr(S[i],3,4))) 
     E[i]<-as.character(as.numeric(substr(E[i],1,2))*60+as.numeric(substr(E[i],3,4))) 

    } 
    S<-as.numeric(S) 
    E<-as.numeric(E) 

    return(E-S) 
} 
elapsedtime(944,1733) 
elapsedtime(44,33) 
elapsedtime(44,133) 
elapsedtime(c(944,44),c(1733,33)) 
elapsedtime(c(44,44),c(33,133)) 
elapsedtime(944,17335) 
elapsedtime(c(944,945),c(1733,17335)) 
elapsedtime(c(944,945),c(1733,17335,34)) 

我不是太執着於需要處理1和2位的情況下,但我需要能夠處理3或4位數的輸入。我在很多日期上運行這個,並且快速做3/4個數字比慢慢地做1,2,3或4個數字更可取。

/編輯:更改代碼,所花的時間

載體

回答

8

嘗試以下功能正常工作:

# calculate number of minutes of timestamp 
mins <- function(x){ 
    floor(x/100)*60+x%%100 
} 

# calculate difference in minutes 
elapsedtime <- function(S,E){ 
    mins(E)-mins(S) 
} 

這避免環路所以矢量化。 mins將工作,如果小時數大於99,即HHHMM,或者您可以修改更高的時間單位。

如果5個數字時間戳其實是錯誤的,你可以添加以下爲mins第一行:

ifelse(x<10000,x,NA) 

所以,你將在差異得到NA當一方或雙方的時間戳都是5個位數。

+0

我喜歡它。感謝您的解決方案。 %%函數到底做了什麼? – Zach 2011-02-15 17:38:33

相關問題