2015-05-06 36 views
5

Szukam 4-dniowej średniej kroczącej w dużym zestawie danych. Problem polega na tym, że niektóre osoby nie mają 4 przypadków, a zatem pojawia się błąd wskazujący, że k < = n nie jest PRAWDA.Usuwanie wierszy na podstawie za mało powtarzających się danych w dużym zestawie danych w R

Czy istnieje sposób na usunięcie osoby, która nie ma wystarczającej ilości danych w zestawie danych?

Oto przykład, w jaki sposób dane będą wyglądać:

 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 

Odpowiedz

4

Jeśli ramka danych jest df, można usunąć wszystkie nazwy, które pojawiają się mniej niż 4 razy dplyr:

library(dplyr) 

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

działa idealnie. Dziękuję Ci! – user3585829

+0

możesz znaleźć [to wprowadzenie] (http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html) do "dplyr" przydatne czytanie. – davechilders

+0

Dziękuję. dplyr wydaje się bardzo pomocnym pakietem. To pomoże mi się z nim zapoznać. – user3585829

0

Można utworzyć drugą strukturę danych, która jest agregowana do poziomu użytkownika, z liczbą dla każdego użytkownika. A następnie dołączyć tę data.frame na pierwotnego przez użytkownika, a następnie podzbiór nową data.frame do miejsca, gdzie liczba> = 4

2

Spróbuj:

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

To będzie tylko zachować grupy większe lub równe 4 i obliczyć średnią kroczącą z 4 dni na 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

Tutaj są dwie opcje do podstawy, jeden z ave gdzie wytworzenia wektora, który ma dla każdego rzędu w grupie, długość tej grupy (ave będzie recyklingu jego rezultat wypełnienie grupę)

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

I kolejna z table, w której liczymy pozycje w każdej grupie i używamy %in%, aby utrzymać wiersze należące do grup z wystarczającą ilością elementów.

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

Oba produkty:

 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

To było łatwe rozwiązanie. Dziękuję Ci. – user3585829