2017-01-31 1 views
2

Ich habe schon einige Statistiken gemacht, aber ich bin völlig neu in R. Ich habe Messwerte von mehreren Sensoren, die ich überprüfen möchte. Dazu möchte ich für jeden Sensor den Mittelwert in den vorherigen und folgenden 3 Minuten vergleichen.
Meine Daten sieht etwa so aus:Vergleichen von Werten in gruppierten Zeilen in R

time sensor reading 
10:01  B  86.7 
10:01  A  87.6 
10:02  A  81.1 
10:02  B  32.1 
10:03  B  80.0 
10:03  A  20.8 
10:04  A  35.2 
10:04  B  10.0 
10:05  B  26.2 
10:05  A  59.0 
10:06  A  94.7 
10:06  B  6.8 
10:07  B  50.4 
10:07  A  5.0 
10:08  A  71.4 
10:08  B  83.5 
10:09  B  33.3 
10:09  A  82.5 

Für 10.05 Die Ergebnisse sollten in etwa so aussieht:

time sensor reading mean 
... 
10:05  A  86.7 43.8 
10:05  B  87.6 51.36666667 
... 

Ich weiß, dass es eine Möglichkeit in SQL ist durch den Datensatz mit einer gruppierten Verbindungs , gefilterte und dann aggregierte Form von sich selbst. Aber ich versuche hier SQL zu vermeiden und bastle mit Aggregat-, Teilmengen- und Schleifenfunktionen. Aber nichts scheint zu funktionieren.

Ich habe das Thema gegooglet, aber entweder ich die falschen Fragen stellen oder es gibt keine Antwort gefunden werden. Oder die Sache ist so einfach, dass ich eine wichtige Lektion verpasst habe.

+1

Bitte zeigen Sie die volle erwartete Ausgabe basierend auf dem von Ihnen bereitgestellten Beispiel. Sie können 'rollmean' von' zoo' überprüfen – akrun

Antwort

1

Sie können versuchen, folgen. Ich habe nur Basis-R-Funktionen verwendet. Vielleicht manchmal ein bisschen zu kompliziert, aber Sie werden einige Ergebnisse bekommen. Hoffentlich die richtigen.

# change to time format 
d$t <- as.POSIXct(d$time, format="%H:%M") 
# function to add or substract 3 minutes 
mns <- function(m) { 
    x <- m * 60 
    return(x) 
} 
# add columns with 3 minutes previous and after 
d$tp <- d$t - mns(3) 
d$ta <- d$t + mns(3) 

# split the data according the sensors 
d1 <- split(d, d$sensor) 

# get the results per sensors and an interval of 6 minutes (before and after) 
res <- lapply(d1, function(x){ 
    Mean=sapply(1:nrow(x), function(i, y){ 
    mean(y[ y$t[i] > y$tp & y$t[i] < y$ta, "reading"], na.rm = T) 
    }, x) 
    cbind.data.frame(time=x[, 1], Mean) 
}) 
# convert to data.frame 
do.call(cbind, res) 
    A.time A.Mean B.time B.Mean 
1 10:01 63.16667 10:01 66.26667 
2 10:02 56.17500 10:02 52.20000 
3 10:03 56.74000 10:03 47.00000 
4 10:04 58.16000 10:04 31.02000 
5 10:05 42.94000 10:05 34.68000 
6 10:06 53.06000 10:06 35.38000 
7 10:07 62.52000 10:07 40.04000 
8 10:08 63.40000 10:08 43.50000 
9 10:09 52.96667 10:09 55.73333 
Verwandte Themen