2012-01-18 4 views
0

私は、このようなデータの種類を持っている:Rの顧客のスーパーマーケットで過ごした時間を見つける方法は次の通りですか?

Date   Status ID 
23-1-2010 11:40 in 321 
23-1-2010 11:53 out 321 
9-1-2010 12:11 in 356 
9-1-2010 12:18 out 356 
23-1-2010 11:37 in 356 
23-1-2010 11:5 out 356 
5-2-2010 13:14 in 398 
5-2-2010 13:30 out 398 
10-3-2010 9:30 in 398 
13-3-2010 11:50 out 377 
16-3-2010 10:30 in 377 
16-3-2010 11:00 out 377 
20-3-2010 12:09 in 377 
20-3-2010 12:30 out 377 

データは、特定の日時にスーパーマーケットを訪れたお客様に説明しています。顧客はIDで識別され、そのステータスも指定されます。

お客様が異なる日にスーパーマーケットで過ごした時間を計算します。私がデータで持っている問題は、一部の顧客にとっては入場時刻または退場時刻のみが記録されていることです。私は一度訪問した顧客をクリアしていますが、ステータスが不足していますが、まだ複数回訪問していて、イン/アウトが欠落しています。

私はこの

#create an empty data frame 
TimeSpent<-rep(NA,length(df$ID)) 
ID<-rep(NA,length(df$ID)) 
Tspent<-data.frame(TimeSpent,ID) 



#compute the time spent time 
for(i in 1:length(df$Date - 1)) 
    { 
     if(isTRUE(df$Status[i] == "in" && df$Status[i+1] == "out")) 
     { 
     Tspent$ID[i] <- df$ID[i] 
     Tspent$TimeSpent[i] <- difftime(df$Date[i+1] - df$Date[i]) 
     } else if(isTRUE(df$Status[i+1] == "in" && df$Status[i+2] == "out")) 
     { 
     Tspent$ID[i] <- df$ID[i+1] 
     Tspent$TimeSpent[i] <- difftime(df$Date[i+2] - df$Date[i+1]) 
     } else 
     { 
     Tspent$ID[i] <- df$ID[i+2] 
     Tspent$TimeSpent[i] <- difftime(df$Date[i+3] - df$Date[i+2]) 
     } 

     i<-i+1 
} 

を試してみましたし、私はこのエラーを取得:as.POSIXct.defaultで エラー(TIME1): がクラスに '時間1' を変換する方法がわからない "POSIXct"

誰かが自分のコードや代替ソリューションを修正する方法を知っていますか?前もって感謝します!

答えて

2

私はあなたのdata.frame(try str(df))の構造を知らないのですが、あなたはPOSIXctオブジェクトに日付を変換しなかったと思います。これは次のように行われます:

as.POSIXct(strptime(df$Date, format='%d-%m-%Y %H:%M')) 

これはおそらくあなたの問題を解決します。

私はあなたが知っていると思った。そして私は読むことができるいくつかのより多くのデータを投稿してくださいされていない場合

編集(日付と時刻の間に空白を私はすぐにそれを読むしようとしたときに私にエラーを与えます)問題はdifftime()機能にあります。あなたは簡単にそれを回避して計算を行うことができます - それは私のサンプルデータのためにうまくいきます。

私のサンプルデータ:

df <- data.frame(Date=(Sys.time()+ runif(20)*3600)) # already delvers timedate object 
    df <- data.frame(df[order(df),1]) 
    df$status <- rep(c('in', 'out'), each=(10)) 
    df$ID  <- rep(c(1:10), each=2) 
    names(df)[1] <- 'Date' 

あなたsligthly変更されたコード

#create an empty data frame 
TimeSpent<-rep(NA,length(df$ID)) 
ID<-rep(NA,length(df$ID)) 
Tspent<-data.frame(TimeSpent,ID) 



#compute the time spent time 
for(i in 1:length(df$Date - 1)) 
    { 
     if(isTRUE(df$Status[i] == "in" && df$Status[i+1] == "out")) 
     { 
     Tspent$ID[i] <- df$ID[i] 
     Tspent$TimeSpent[i] <- df$Date[i+1] - df$Date[i] 
     } else if(isTRUE(df$Status[i+1] == "in" && df$Status[i+2] == "out")) 
     { 
     Tspent$ID[i] <- df$ID[i+1] 
     Tspent$TimeSpent[i] <- df$Date[i+2] - df$Date[i+1] ** just skipped the difftime function 
     } else 
     { 
     Tspent$ID[i] <- df$ID[i+2] 
     Tspent$TimeSpent[i] <- df$Date[i+3] - df$Date[i+2] 
     } 

     i<-i+1 
} 

出力

TimeSpent ID 
1 8.266451 2 
2 4.044099 2 
3 12.895463 3 
4 2.699761 3 
5 1.484544 4 

+0

は、あなたの答えセブいただきありがとうございます。私はこれを試みたが、私はまだ同じエラーが発生します。私はあなたにcsvファイルを送ることができます。あなたは私にそのことを教えてもらえますか? – Chris

+0

私のサンプルデータでコードを追加しました.... – Seb

+0

Sebありがとうございます。それは今働いているようです。 – Chris

関連する問題