2017-05-03 38 views
0

我有如下表:如何根據時間差的長格式轉換爲寬幅

library(data.table) 

data <- data.table(Timestamp = c(as.POSIXct("2016-01-15 02:00:00"), 
          as.POSIXct("2016-01-15 04:00:00"), 
          as.POSIXct("2016-01-16 02:00:00"), 
          as.POSIXct("2016-01-15 05:00:00"), 
          as.POSIXct("2016-01-17 08:00:00"), 
          as.POSIXct("2016-01-17 08:00:00"), 
          as.POSIXct("2016-01-17 09:00:00"), 
          as.POSIXct("2016-01-22 09:00:00")), 
       Activty = c("Eating Beef", 
          "Eating Cake", 
          "Eating Beef", 
          "Eating Cake", 
          "Sleeping", 
          "Eating Beef", 
          "Eating Beef", 
          "Sleeping"), 
       Tag = c("S", 
         "S", 
         "E", 
         "E", 
         "S", 
         "S", 
         "E", 
         "E" 
         )) 

我想要做的是檢索的開始和結束時間。如果我們查看錶我們得到:

  Timestamp  Activty Tag 
1: 2016-01-15 02:00:00 Eating Beef S 
2: 2016-01-15 04:00:00 Eating Cake S 
3: 2016-01-16 02:00:00 Eating Beef E 
4: 2016-01-15 05:00:00 Eating Cake E 
5: 2016-01-17 08:00:00 Sleeping  S 
6: 2016-01-17 08:00:00 Eating Beef S 
7: 2016-01-17 09:00:00 Eating Beef E 
8: 2016-01-22 09:00:00 Sleeping  E 

所以第1行,是時候當我開始吃牛肉和第3行是當我停止吃牛肉。因此,如果連續有相同的活動,那麼帶有S的那個應該與第一個E相匹配.S表示一個開始活動,而E表示一個結束活動。

我應該如何在data.table中解決這個問題?

最終的結果應該是這樣的:

  StartTime EndTime    Activty 
1: 2016-01-15 02:00:00 2016-01-16 02:00:00 Eating Beef 
2: 2016-01-15 04:00:00 2016-01-15 05:00:00 Eating Cake 
5: 2016-01-17 08:00:00 2016-01-22 09:00:00 Sleeping 
6: 2016-01-17 08:00:00 2016-01-17 09:00:00 Eating Beef 

(這個順序是任意的,但只是用來描述最終結果,即開始時間與結束時間相結合。)

+0

你知道'sqldf'包嗎?......它似乎是這類任務的好選擇! – Hackerman

+2

Arg,我希望有downvote按鈕的意見... –

回答

0

使用data.table的方法:

library(data.table) 
data<-data[,n:=c(1:.N), by=list(Activty,Tag)][order(Activty,Tag,Timestamp)] 
x <-dcast.data.table(data, Activty+n~Tag, value.var = 'Timestamp') 
x$n <- NULL 

x 

     Activty     E     S 
1: Eating Beef 2016-01-16 02:00:00 2016-01-15 02:00:00 
2: Eating Beef 2016-01-17 09:00:00 2016-01-17 08:00:00 
3: Eating Cake 2016-01-15 05:00:00 2016-01-15 04:00:00 
4: Sleeping 2016-01-22 09:00:00 2016-01-17 08:00:00 

它接近所需的輸出。

相關問題