2012-01-18 17 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(時間1): 不知道如何轉換「時間1」上課「POSIXct」

有誰知道如何糾正我的代碼或其他解決方案?提前致謝!

回答

2

我不知道你的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' 

你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 2012-01-18 21:14:58

+0

添加了我的樣本數據的代碼.... – Seb 2012-01-19 06:38:57

+0

謝謝Seb。看來它現在正在工作。 – Chris 2012-01-19 08:49:01

相關問題