Как найти время, проведенное в супермаркете клиента в R, по следующим данным? - PullRequest
0 голосов
/ 18 января 2012

У меня есть такой тип данных:

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

Данные описывают клиентов, которые посетили супермаркет в определенную дату и время. Клиенты идентифицируются по их идентификатору, а также указывается их статус.

Я хочу посчитать, сколько времени клиент провел в супермаркете в разные дни. Проблема с данными заключается в том, что для некоторых клиентов записывается только время входа или выхода. Я очистил клиентов, которые посетили один раз, и отсутствует статус входа или выхода, но у меня все еще есть некоторые из них, которые посетили более одного раза, а вход / выход отсутствует.

Я пробовал это

#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"

Кто-нибудь знает, как исправить мой код или альтернативное решение? Заранее спасибо!

1 Ответ

2 голосов
/ 18 января 2012

Я не знаю структуру вашего data.frame (попробуйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...