2017-03-17 5 views
0

J'ai du mal à ajuster une fonction que j'ai écrite, et ça me donne mal à la tête, alors j'ai pensé que je l'afficherais ici.Moyenne pondérée à travers la fonction Par

dans la fonction J'utilise la fonction "by" de R, qui place la trame de données dans des sous-ensembles et exécute une fonction sur celle-ci.

Maintenant j'étends la fonction pour inclure weighted.mean (du paquet 'descr') et j'obtiens une erreur que la longueur des x et w ne sont pas égales.

code pour afficher:

set.seed(100) 
d1 <- rnorm(300) 
d2 <- (floor(runif(100, min=1, max=4))) 
weight <- rnorm(300,mean = 1, sd = 1) 
df <- cbind.data.frame(d1,d2,weight) 
df$d2 <- factor(df$d2, 
       levels = c(1,2,3,4), 
       labels = c("red", "blue", "green","orange")) 



require('descr') 

by(df$d1, df$d2, function(x) mean(x=x, na.rm=TRUE)) 
by(df$d1, df$d2, function(x) weighted.mean(x=x,w=df$weight na.rm=TRUE)) 

Alors je fais une trame de données avec 1 valeur numérique, 1 facteur avec 4 niveaux, mais seulement 3 contiennent des données (par exemple les données manquantes/fitlered) et une variable de poids .

La 8ème commande est ce que j'ai maintenant, mais maintenant je dois y ajouter du poids. Donc, cela me donne la moyenne par couleur. il renvoie aussi NA pour les niveaux de d2 où je n'ai pas de données, ce dont j'ai besoin. (Comme je travaille sur différents ensembles de données et que j'ai besoin de fusionner les résultats, il est important que tous les niveaux définis soient également sortis.)

la 9ème commande (celle avec weighted.mean dedans) que la longueur de x/w est différente. C'est parce que crée par un sous-ensemble de df $ d1 par pièce de df $ d2, mais le poids dans le weighted.mean (x = x, w = poids, ...) est la variable entière et pas seulement la partie de le sous-ensemble.

J'ai essayé de regarder le code de weighted.mean et de voir si je ne peux pas le réécrire, mais n'ai pas trouvé la solution. Toute aide est toujours la bienvenue.

Répondre

0

L'astuce est d'utiliser l'ensemble data.frame en entrée divisée par les indicies

by(data = df, INDICES = df$d2, FUN = function(dfgroup) { 
    weighted.mean(x = dfgroup$d1, w = dfgroup$weight, na.rm=TRUE) 
}) 
+0

Tx un million, fonctionne parfaitement .. ne savait pas que l'on, mais se souvenir désormais .. –