2016-04-15 4 views
0

Ich habe eine Reihe von diskontinuierlichen Daten in Blöcke unterteilt, die wie folgt aussehen:Wie mittle ich Blöcke diskontinuierlicher Daten mit einem Flag?

X1 X2 X3 
1 10.1 1 
2 10.2 1 
3 10.3 1 
4 10.4 1 
5 NA 0 
6 NA 0 
7 20.1 1 
8 20.2 1 
9 NA 0 
10 NA 0 

Grundsätzlich muss ich alle Daten mit Flag X3 = 1 im ersten Block Durchschnitt (10.1,10.2,10.3,10.4) , als in der Sekunde (20.1,20.2) und so weiter. Ein gleitender Durchschnitt würde nicht funktionieren, weil die Blöcke leicht unterschiedliche Größen haben (in diesem Fall ist der erste 4 Punkte, der zweite nur 2). Ich kann mir keine einfache Möglichkeit vorstellen, das Flag zu verwenden, ohne die ganze Matrix Zeile für Zeile zu analysieren. Irgendwelche Vorschläge?

Antwort

3

Wir können data.table verwenden. Konvertieren Sie die 'data.frame' auf 'data.table' (setDT(df1), Gruppe von rleid von 'X3', bekommen die mean von 'X2' und entfernen Sie die NA Elemente in der Ausgabe mit na.omit.

library(data.table) 
na.omit(setDT(df1)[, .(MeanX2=mean(X2, na.rm=TRUE)) , .(grp= rleid(X3))]) 
# grp MeanX2 
#1: 1 10.25 
#2: 3 20.15