2017-05-03 3 views
0

Ich habe die folgende Tabelle:Wie langes Format Wide-Format konvertieren, basierend auf Zeitdifferenzen

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

Was ich will, um die Start- und Endzeiten tun abruft. Wenn wir die Tabelle sehen wir bekommen:

  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 

So 1 Zeile, ist die Zeit, wenn ich anfangen zu essen Rindfleisch und Zeile 3 ist, wenn ich Rindfleisch aufhören zu essen. Bei einer Reihe mit der gleichen Aktivität sollte die mit einem S mit der ersten E übereinstimmen. Das S zeigt eine Startaktivität an, während die E eine Endaktivität ist.

Wie soll ich dieses Problem in data.table angehen?

  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 

(Diese Reihenfolge ist beliebig, sondern nur um das Endergebnis zeigen verwendet, dh die Startzeiten mit den Endzeiten zu kombinieren.)

+0

Kennen Sie das 'sqldf' Paket? .... es scheint ein guter Kandidat für diese Art von Aufgaben zu sein! – Hackerman

+2

Arg, ich wünschte es gäbe einen Downvote Button für Kommentare ... –

Antwort

0
:

so etwas wie dies Das Endergebnis sollte

Ein Ansatz unter Verwendung von 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 

Es ist nah an der gewünschten Ausgabe.

Verwandte Themen