2017-05-10 5 views
0

Im Folgenden finden Sie eine Tabelle, die ich in R. (Ereignisprotokoll)Wie zwei Reihen in R verschmelzen

Case.ID | Activity | Timestamp | Resource | State 
------------------------------------------------------------ 
    0 |Take order| 00:12:04 |  Waiter | Assign 
------------------------------------------------------------ 
    0 |Take order| 00:18:02 |    | Complete 
------------------------------------------------------------ 
    1 |Bring food| 00:47:23 | Cook helper | Assign 
------------------------------------------------------------ 
    1 |Bring food| 00:52:41 |    | Complete 
------------------------------------------------------------ 
    1 |Bring food| 00:54:52 | Cook helper | Assign 
------------------------------------------------------------ 
    1 |Bring food| 00:59:11 |    | Complete 

Zeilen mit dem Wert in der Spalte Ressource habe, ist ein Start der Aktivität und das Ende der Aktivitäten kein Wert in dieser Zelle.

Ich habe versucht,

assign <- subset(csv, select=c(Case.ID,Activity,Timestamp,State), State=="assign") 
complete <- subset(csv, select=c(Case.ID,Activity,Timestamp,State), State=="complete") 
merge <- merge(assign, complete, by=c("Case.ID", "Activity")) 

aber es zeigt, wie unten einige Fehler.

Zweite und vierte Zeile sollten eliminiert werden, aber nicht sicher, wie es geht.

Case.ID | Activity | Start.Timestamp | End.Timestamp | 
------------------------------------------------------ 
    1 |Bring food| 00:47:23  | 00:52:41 | 
------------------------------------------------------ 
    1 |Bring food| 00:47:23  | 00:59:11 | 
------------------------------------------------------ 
    1 |Bring food| 00:54:52  | 00:52:41 | 
------------------------------------------------------ 
    1 |Bring food| 00:54:52  | 00:59:11 | 
+0

Ist Ihre Ausgabe korrekt? – Sotos

+0

Wenn Sie doppelte Zeilen loswerden müssen, können Sie 'df <- dplyr :: distinct (df)' oder 'df <- unique (df [, 1: 4])' verwenden, vorausgesetzt, Ihr Datenrahmen hat nur diese vier Spalten – Craig

+0

Ich bearbeitet, um den genauen Code zu schreiben, den ich eintippte. –

Antwort

0

Eine zusätzliche Gruppenvariable und dann auf Wide-Format wie folgt umformen:

df$grp <- cumsum(df$Resource!='') 

library(reshape2) 
df2 <- dcast(df, Case.ID + Activity + grp ~ State, value.var = 'Timestamp')[,-3] 

die gibt:

> df2 
    Case.ID Activity assign complete 
1  0 Take order 00:12:04 00:18:02 
2  1 Bring food 00:47:23 00:52:41 
3  1 Bring food 00:54:52 00:59:11 

Eine Alternative mit data.table:

library(data.table) 
df2 <- dcast(setDT(df)[, grp := cumsum(Resource!='')], 
      Case.ID + Activity + grp ~ State, value.var = 'Timestamp')[, grp := NULL][] 
Verwandte Themen