2015-05-06 8 views
5

Sto cercando di eseguire una media mobile di 4 giorni su un ampio set di dati. Il problema è che alcuni individui non hanno 4 casi e quindi ottengo un errore che indica che k < = n non è VERO.Rimozione di righe basate su dati ripetuti non sufficienti in un set di dati di grandi dimensioni in R

C'è un modo per rimuovere qualsiasi individuo che non ha abbastanza dati nel set di dati?

Ecco un esempio di come i dati sarebbero guardare:

 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 

risposta

4

Se la cornice di dati è df, è possibile rimuovere tutti i nomi che si verificano meno di 4 volte con dplyr:

library(dplyr) 

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

funziona perfettamente. Grazie! – user3585829

+0

potresti trovare [questa introduzione] (http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html) alla lettura utile di 'dplyr'. – davechilders

+0

Grazie. dplyr sembra un pacchetto molto utile. Questo mi aiuterà a familiarizzare con esso. – user3585829

0

È possibile creare un secondo data.frame aggregato fino al livello utente, con un conteggio per ciascun utente. Poi unirsi che data.frame su quella originale da parte dell'utente, quindi il nuovo sottoinsieme data.frame dove count> = 4

2

Prova:

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

Questo servirà solo a tenere gruppi maggiore o uguale a 4 e calcolare una media mobile di 4 giorni su 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

Ecco due opzioni di base, una con ave dove si produce un vettore che ha per ciascuna riga in un gruppo, la lunghezza di tale gruppo (ave riciclerà il risultato di riempire un gruppo):

E un altro con table in cui contiamo gli elementi di ciascun gruppo e utilizzare %in% per mantenere solo le righe che appartengono ai gruppi con elementi sufficienti.

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

Entrambi i prodotti:

 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

Questa è stata una soluzione facile. Grazie. – user3585829

Problemi correlati