2015-02-24 1 views
4

J'ai une trame de données qui a 5 variables et 800 lignes:Recherche et supprimer les valeurs aberrantes d'une trame de données regroupées par une variable

head(df) 
     V1 variable value element OtolithNum 
1 24.9835  V7 130230.0  Mg   25 
2 24.9835  V8 145844.0  Mg   25 
3 24.9835  V9 126126.0  Mg   25 
4 24.9835  V10 103152.0  Mg   25 
5 24.9835  V11 129571.9  Mg   25 
6 24.9835  V12 114214.0  Mg   25 

je dois effectuer les opérations suivantes:

  1. identifier tous les les valeurs (à partir de la variable "valeur") qui sont> 2 écarts types par rapport à la médiane, groupés par la variable d'élément.
  2. supprimer les valeurs aberrantes à partir de la trame de données (ou créer une nouvelle trame de données avec les valeurs aberrantes exclus.

J'utilise paquet dplyr et ont utilisé le code suivant à un groupe par la variable « élément », et fournir le des valeurs moyennes:

df1=df %>% 
    group_by(element) %>% 
    summarise_each(funs(mean), value) 

Pouvez-vous s'il vous plaît me aider à manipuler le code ou ajouter ci-dessus afin d'éliminer les valeurs aberrantes (définis ci-dessus,> 2 SD de la médiane) regroupés par la variable « élément », avant extrais les moyens

J'ai essayé le code suivant d'un autre poste (c'est pourquoi les noms de données ne correspondent pas à mes données personnelles ci-dessus), sans chance:

#standardize each column (we use it in the outdet function) 
    scale(dat) 
#create function that looks for values > +/- 2 sd from mean 
    outdet <- function(x) abs(scale(x)) >= 2 
#index with the function to remove those values 
    dat[!apply(sapply(dat, outdet), 1, any), ] 
+0

Vous devrez peut-être vérifier http://stackoverflow.com/questions/26769976/mean-excluding-outliers-using-dplyr – akrun

+0

Vous devriez être averti que c'est statistiquement absurde. –

Répondre

8

Voici une méthode utilisant la base R:

element <- sample(letters[1:5], 1e4, replace=T) 
value <- rnorm(1e4) 
df <- data.frame(element, value) 

means.without.ols <- tapply(value, element, function(x) { 
    mean(x[!(abs(x - median(x)) > 2*sd(x))]) 
}) 

Et en utilisant dplyr

df1 = df %>% 
    group_by(element) %>% 
    filter(!(abs(value - median(value)) > 2*sd(value))) %>% 
    summarise_each(funs(mean), value) 

Comparaison des résultats:

> means.without.ols 
      a   b   c   d   e 
-0.008059215 -0.035448381 -0.013836321 -0.013537466 0.021170663 

> df1 
Source: local data frame [5 x 2] 

    element  value 
1  a -0.008059215 
2  b -0.035448381 
3  c -0.013836321 
4  d -0.013537466 
5  e 0.021170663