2017-05-29 5 views
1

Ich habe Daten mit str von POSIXct. Für jede Beobachtung möchte ich die Anzahl der Beobachtungen, die dieser Beobachtung vorausgingen, in Zeitintervallen von 6 und 24 Stunden zählen (die Zeitintervalle müssen flexibel sein).Anzahl der Beobachtungen innerhalb des Zeitintervalls zählen

Hier einige reproduzierbaren Beispiel:

Dat <- data.frame(x=1:5, y=as.POSIXct(c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", "2017-02-01 23:30:35", "2017-02-02 01:15:35"))) 

Und ich möchte die folgende Ausgabe erhalten:

x v6 v24 
1 -- -- 
2 1 1 
3 2 2 
4 1 3 
5 1 4 

Antwort

1

Wahrscheinlich effizientere Möglichkeiten existieren, aber dies sollte funktionieren

Dat <- data.frame(x=1:5, y=as.POSIXct(c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", 
            "2017-02-01 23:30:35", "2017-02-01 01:15:35"))) 

Dat <- Dat[order(Dat[,"y"]),] 

require(lubridate) 

Dat[,"span6"] <- Dat[,"y"] - hours(6) 
Dat[,"span24"] <- Dat[,"y"] - hours(24) 

for(s in Dat[,"span6"]){ 
    Dat[which(Dat[,"span6"]==s),"v6"] <- 
    nrow(Dat[which(Dat[,"y"]>=s & Dat[,"y"]<Dat[which(Dat[,"span6"]==s),"y"]),]) 
} 
for(s in Dat[,"span24"]){ 
    Dat[which(Dat[,"span24"]==s),"v24"] <- 
    nrow(Dat[which(Dat[,"y"]>=s & Dat[,"y"]<Dat[which(Dat[,"span24"]==s),"y"]),]) 
} 
Dat <- Dat[,!(names(Dat) %in% c("span6","span24"))] 
+0

Es sieht ungeschickt aus, funktioniert aber perfekt! Vielen Dank. – staove7

1

Sie könnten versuchen, mit library(sqldf). Ich versuche, Ihnen ein einfaches Beispiel mit Daten zu erhalten:

library(sqldf) 

Dat <- data.frame(x=1:5, y=c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", "2017-02-01 23:30:35", "2017-02-01 01:15:35")) 

sqldf('select distinct count (x) as count, 
     x 
     from Dat 
     where y between "2017-02-01 16:05:35" and "2017-02-01 18:15:35" 
     group by x') 

Der Ausgang ist wie folgt:

count x 
1  1 1 
2  1 2 

Sie einen zählen, wie viele x-Werte liegen im Bereich ausgedrückt durch

where y between "2017-02-01 16:05:35" and "2017-02-01 18:15:35"

die Extreme des Bereichs sind in der Zählung enthalten. Ist die richtige Lösung für Ihr Problem?

+0

@ G.Grothiedieck hast du meinen Code ausprobiert? Weil ich es ausprobiert und geschrieben habe, damit es funktioniert! –

+0

@ G.Grothiedieck ja sorry, weil ich vergessen habe, den Code as.POSIXct() zu löschen. Es funktioniert nur ohne as.POSIXct() –

+0

Es funktioniert jetzt, aber ich würde empfehlen, einfache Anführungszeichen um die Literaldaten zu verwenden, in welchem ​​Fall es auch mit dem H2-Backend ebenso arbeiten würde. Außerdem würde es dann mit dem H2-Backend arbeiten, selbst wenn y POSIXct ist. –

Verwandte Themen