0

私はそのようなタイプのデータを持っています:

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 によって識別され、ステータスも指定されます。

顧客が異なる日にスーパーマーケットで過ごした時間を計算したいと考えています。私がデータに関して抱えている問題は、一部の顧客については、入場時間または退場時間のみが記録されることです。1 回訪問した顧客をクリアしましたが、in または out ステータスが欠落していますが、複数回訪問し、in/out が欠落している顧客がまだいくつかあります。

私はこれを試しました

#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) のエラー: 'time1' をクラス "POSIXct" に変換する方法がわかりません

私のコードまたは代替ソリューションを修正する方法を知っている人はいますか? 前もって感謝します!

4

1 に答える 1

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'

わずかに変更されたコード

 #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
于 2012-01-18T18:37:08.123 に答える