web-dev-qa-db-fra.com

Moyenne par facteur par niveau

C'est peut-être simple mais je ne trouve pas de réponse sur le Web. J'ai un problème avec le calcul de la moyenne par facteurs par niveau . Mes données sont typiques:

factor, value
a,1
a,2
b,1
b,1
b,1
c,1

Je veux obtenir le vecteur A ne contient la moyenne que pour le niveau "a" Si je tape A sur la console, je veux obtenir 1,5 Et cette méthode de calcul de la moyenne doit utiliser des facteurs.

Merci d'avance pour l'aide. 

13
Bartek Taciak

Juste pour le plaisir de poster la solution data.table même si vous devriez probablement faire ce que @lukeA a suggéré 

library(data.table) 
A <- setDT(df[df$factor == "a", ])[, mean(value)]
## [1] 1.5
3
David Arenburg

jetez un oeil à tapply, qui vous permet de décomposer un vecteur en fonction d'un facteur et d'appliquer une fonction à chaque sous-ensemble

> dat<-data.frame(factor=sample(c("a","b","c"), 10, T), value=rnorm(10))
> r1<-with(dat, tapply(value, factor, mean))
> r1
         a          b          c
 0.3877001 -0.4079463 -1.0837449
> r1[["a"]]
[1] 0.3877001

Vous pouvez accéder à vos résultats en utilisant r1[["a"]] etc.

Alternativement, l’un des packages R populaires (plyr) a de très jolies façons de le faire.

> library(plyr)
> r2<-ddply(dat, .(factor), summarize, mean=mean(value))
> r2
  factor       mean
1      a  0.3877001
2      b -0.4079463
3      c -1.0837449
> subset(r2,factor=="a",select="mean")
       mean
1 0.3877001

Vous pouvez également utiliser dlply à la place (qui prend un cadre de données et renvoie une liste à la place)

> dlply(dat, .(factor), summarize, mean=mean(value))$a
       mean
1 0.3877001
26
JPC

Le code suivant demande la moyenne de la valeur lorsque facteur = a:

mean(data$value[data$factor == "a"])
3
Lenatis

Une autre possibilité simple serait la fonction "par":

by(value, factor, mean)

Vous pouvez obtenir la moyenne du niveau de facteur "a" par:

factor_means <- by(value, factor, mean)
factor_means[attr(factor_means, "dimnames")$factor=="a"]
1
Ruediger Ziege