2015-05-06 11 views
5

Ich möchte einen gleitenden Durchschnitt für 4 Tage über einen großen Datensatz hinweg erstellen. Das Problem ist, dass einige Personen nicht 4 Fälle haben und daher bekomme ich einen Fehler, der anzeigt, dass k < = n nicht WAHR ist.Entfernen von Zeilen basierend auf nicht genügend wiederholten Daten in einem großen Datensatz in R

Gibt es eine Möglichkeit, einzelne Personen zu entfernen, die nicht genügend Daten im Datensatz haben? Hier

ist ein Beispiel dafür, wie die Daten aussehen:

 Name variable.1 
1  Kim 64.703950 
2  Kim 926.339849 
3  Kim 128.662977 
4  Kim 290.888594 
5  Kim 869.418523 
6  Bob 594.973849 
7  Bob 408.159544 
8  Bob 609.140928 
9 Joseph 496.779712 
10 Joseph 444.028668 
11 Joseph -213.375635 
12 Joseph -76.728981 
13 Joseph 265.642784 
14 Hank -91.646728 
15 Hank 170.209746 
16 Hank 97.889889 
17 Hank 12.069074 
18 Hank 402.361731 
19 Earl 721.941796 
20 Earl 4.823148 
21 Earl 696.299627 

Antwort

4

Wenn Ihr Datenrahmen df ist, können Sie alle Namen entfernen, die weniger als 4 mal mit dplyr auftreten:

library(dplyr) 

df %>% 
    group_by(Name) %>% 
    filter(n() >= 4) 
+0

perfekt funktioniert. Vielen Dank! – user3585829

+0

finden Sie [diese Einführung] (http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html), um 'dplyr' nützliches Lesen zu finden. – davechilders

+0

Danke. dplyr scheint ein sehr hilfreiches Paket zu sein. Dies wird mir helfen, mich damit vertraut zu machen. – user3585829

0

Sie könnten ein zweites data.frame erstellen, das bis zur Benutzerebene aggregiert ist, mit einer Zählung für jeden Benutzer. Dann kommen Sie, dass data.frame auf dem Original durch den Benutzer, der Teilmenge dann die neue data.frame, wo count> = 4

2

Versuchen:

library(zoo) 
library(dplyr) 
df %>% 
    group_by(Name) %>% 
    filter(n() >= 4) %>% 
    mutate(daymean = rollmean(variable.1, 4, align="right", na.pad=TRUE)) 

Dies wird nur halten Gruppen größer oder gleich 4 und Berechnen Sie einen 4-Tage-Durchschnitt auf variable.1.

#  Name variable.1 daymean 
#1  Kim 64.70395  NA 
#2  Kim 926.33985  NA 
#3  Kim 128.66298  NA 
#4  Kim 290.88859 352.6488 
#5  Kim 869.41852 553.8275 
#6 Joseph 496.77971  NA 
#7 Joseph 444.02867  NA 
#8 Joseph -213.37563  NA 
#9 Joseph -76.72898 162.6759 
#10 Joseph 265.64278 104.8917 
#11 Hank -91.64673  NA 
#12 Hank 170.20975  NA 
#13 Hank 97.88989  NA 
#14 Hank 12.06907 47.1305 
#15 Hank 402.36173 170.6326 
0

Hier sind zwei Möglichkeiten in der Basis, ein mit ave wo wir einen Vektor produzieren, die für jede Reihe in einer Gruppe aufweist, die Länge dieser Gruppe (ave wird sein Ergebnis recycelt eine Gruppe zu füllen):

subset(DF, ave(seq(Name), Name, FUN=length) > 4) 

und ein anderer mit table wo wir die Einzelteile in jeder Gruppe zählen und verwenden %in%, um nur die Zeilen zu halten, die mit genügend Elemente zu Gruppen gehören.

subset(DF, Name %in% names(table(Name)[table(Name) > 4])) 

Beide Produkte:

 Name variable.1 
1  Kim 64.70395 
2  Kim 926.33985 
3  Kim 128.66298 
4  Kim 290.88859 
5  Kim 869.41852 
9 Joseph 496.77971 
10 Joseph 444.02867 
11 Joseph -213.37563 
12 Joseph -76.72898 
13 Joseph 265.64278 
14 Hank -91.64673 
15 Hank 170.20975 
16 Hank 97.88989 
17 Hank 12.06907 
18 Hank 402.36173 
+0

Das war eine einfache Lösung. Vielen Dank. – user3585829

Verwandte Themen