2016-06-15 4 views
0

Angenommen ich einen Datenrahmen wie folgt aufweisen,Filter für die Datetimes der Lücke größer oder gleich eine Zahl hat - R

ID date   difference 
1 5/1/2016 4:46 NA 
2 5/1/2016 4:55 9 
3 5/1/2016 5:01 6 
4 5/1/2016 5:09 8 
5 5/1/2016 5:16 7 
6 5/1/2016 5:24 8 
7 5/1/2016 5:31 7 
8 5/1/2016 5:40 9 
9 5/1/2016 5:46 6 
10 5/1/2016 5:49 3 
11 5/1/2016 5:54 5 
12 5/1/2016 5:57 3 
13 5/1/2016 6:10 13 

Hier I nach Einträgen filtern möchten, dass die Zeitdifferenz größer als oder gleich haben zu 9. Ich möchte zwei Einträge filtern, bevor der Wert der Zeitdifferenz 9 und ein Eintrag danach ist. Grundsätzlich möchte ich die Trends analysieren, wenn der Zeitunterschied mehr als 9 Minuten beträgt. Ich möchte also zwei Einträge davor und einen Eintrag danach machen, damit ich für jeden Block von Zeiteinträgen vier Einträge habe, die untersucht werden müssen.

ich in der Lage bin zu filtern direkt mit einem Eintrag,

data %>% filter(difference >= 9) 

Aber ich will, bevor es zwei Einträge nehmen und einen Eintrag, nachdem es zu untersuchen. Im Idealfall soll meine Ausgabe wie seine

ID date   difference 
1 5/1/2016 4:46 NA 
2 5/1/2016 4:55 9 
3 5/1/2016 5:01 6 
6 5/1/2016 5:24 8 
7 5/1/2016 5:31 7 
8 5/1/2016 5:40 9 
9 5/1/2016 5:46 6 
11 5/1/2016 5:54 5 
12 5/1/2016 5:57 3 
13 5/1/2016 6:10 13 

Wo immer dann, wenn die Zeitdifferenz größer oder gleich 9, ich zwei, bevor Einträge und einer nach dem Eintrag.

Kann jemand mir eine Idee geben, wie man sich diesem nähert?

Dank

Antwort

1

Sie können versuchen, die shift, Reduce Methode in data.table, nehme dt ist Ihr data.frame:

library(data.table) 
setDT(dt) 
dt[Reduce("|", c(shift(difference >= 9, n = 0:1, type = "lag"), 
       shift(difference >=9, n = 1:2, type = "lead")))] 

      ID date difference 
1: 5/1/2016 4:46   NA 
2: 5/1/2016 4:55   9 
3: 5/1/2016 5:01   6 
4: 5/1/2016 5:24   8 
5: 5/1/2016 5:31   7 
6: 5/1/2016 5:40   9 
7: 5/1/2016 5:46   6 
8: 5/1/2016 5:54   5 
9: 5/1/2016 5:57   3 
10: 5/1/2016 6:10   13 
+0

Dank für diese ein. Das funktioniert. Aber wenn ich nach einer Variablen gruppieren möchte und es rekursiv machen möchte, wie kann ich das tun? – haimen

+0

für ex, ich mag nicht die vorherigen Tage wie in früheren Aufzeichnungen holen, so dass ich es Gruppe für Tag, in diesem Fall würde ich nur Einträge in einer bestimmten cay will und ich nicht zu den vorherigen Tag Aufzeichnungen gehen will. Also gruppiere ich es am Tag hier und dann möchte ich das machen. – haimen

+0

In diesem Fall können Sie versuchen, dt [, .SD [Reduce ("|", c (Verschiebung (Differenz> = 9, n = 0: 1, type = "lag"), Verschiebung (Differenz> = 9, n = 1: 2, type = "lead")))], by = Liste (ID)] '. wo 'ID' die Gruppenvariable ist. – Psidom

2

Hinweis: Ich habe eine Platzhalter-Serie für "date", weil es doesn t im Zusammenhang mit diesem Code.

Es gibt keinen einzigen Befehl zu tun, was Sie brauchen, soweit ich weiß. Ich würde dies mit einer Schleife empfehlen tun:

df <- data.frame(1:13) 
df <- cbind(df,2000:2012,c(NA,9,6,8,7,8,7,9,6,3,5,3,13)) 
colnames(df) <- c("ID","date","difference") 

whichAtLeast9 <- which(df$difference >= 9) 
wantedRows <- whichAtLeast9 

for (i in whichAtLeast9) { 
    entries_before <- c(i-1,i-2) 
    entries_before <- subset(entries_before,entries_before>0) 
    wantedRows <- append(wantedRows,entries_before) 
    entries_after <- i+1 
    entries_after <- subset(entries_after,entries_after<=13) 
    wantedRows <- append(wantedRows,entries_after) 
} 

# Remove duplicates and sort. 
wantedRows <- sort(unique(wantedRows)) 

finaldf <- df[wantedRows,] 

Ergebnis:

> finaldf 
    ID date difference 
1 1 2000   NA 
2 2 2001   9 
3 3 2002   6 
6 6 2005   8 
7 7 2006   7 
8 8 2007   9 
9 9 2008   6 
11 11 2010   5 
12 12 2011   3 
13 13 2012   13 
Verwandte Themen