2017-08-01 5 views
1

Ich habe eine unregelmäßige Zeitreihe in einem dat.frame. Wie kann ich eine Zeile pro Ereignis für den maximalen Wert in jedem Ereignis erhalten? (nicht nur der Maximalwert pro Ereignis.)Ereigniserkennung: Zeile pro Ereignis abrufen

Ereignisse werden als unterschiedlich definiert, wenn sie mehr als eine bestimmte Zeit auseinander liegen, z. B. drei Tage. Hier einige gefälschten Daten zu spielen, um mit:

set.seed(42) 
x <- data.frame(date=as.Date("2017-08-01")+cumsum(ceiling(rexp(200, rate=0.2))), 
       value=round(cumsum(rnorm(200, sd=8)))+500) 
plot(x, type="o", pch=16, cex=0.6, las=1) 
head(x, 20) 
+4

Ich verstehe nicht, was passiert ist ... Brauchen Sie Hilfe? Hast du es gepostet, damit du es beantworten kannst? Du brauchst eine andere Methode? ... Grundsätzlich ... was brauchst du? – Sotos

+0

Dies war eine Selbstantwort (https://stackoverflow.com/help/self-answer). Ich denke, ich hätte das deutlicher machen können. Es könnte jedoch bessere Ansätze geben, daher wären diese willkommen. –

+0

Was ist die Frage, die beantwortet wurde? – Florian

Antwort

0
# Time differences between observations: 
x$diff <- c(0, as.numeric(diff(x$date))) 
# distinct event if more than 3 days apart: 
x$event <- cumsum(x$diff>3) 
# simply get maximum value per event: 
tapply(x$value, x$event, max, na.rm=TRUE) 

# Get one observation row per event (the maximum): 
x$max <- unlist(tapply(x$value, x$event, FUN=function(v){ 
    out <- rep(0, length(v)) 
    out[which.max(v)] <- 1 # select first maximum value if there are ties 
    out 
    })) 

head(x, 20) 

# independent event maxima rows: 
x[x$max==1, 1:2] 

Stundenzeitdifferenzen können wie folgt erreicht werden:

diffs <- as.difftime(diff(x$date)) 
units(diffs) <- "hours" 
diffs <- as.numeric(diffs)