2011-02-15 3 views
1

2つのタイムスタンプ間の経過時間を計算するためにエレガントな関数を書こうとしています。 hhmm。経過時間を分の整数で返したいと思います。R:2つの数値の間の経過時間を計算します。たとえば、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) 

タイムスタンプのいずれかまたは両方が5桁のときですから、差のNAを取得します。

+0

私はそれが好きです。ソリューションに感謝します。 %%関数は正確に何をしますか? – Zach

+0

Modulus演算子で、整数の除算で余りを計算します。 – James

+0

もちろん!もう一度ありがとう、それは速かった! – Zach

関連する問題