2011-09-17 4 views
0

J'ai deux listes. La première liste a un nombre fini d'options:R script - Obtenir des moyennes

a = [1, 1.5, 2, 2.5, 2, 2.5, 1, 1.5, 1, 2.5] 

puis-je une autre liste qui a des entiers

b = [34, 67, 45, 12, 45, 78, 90, 50, 60, 12] 

Comme vous pouvez le voir, la liste a, les seules valeurs possibles sont 1, 1,5 , 2 et 2.5. Notez également que les deux listes correspondent les unes aux autres. Donc, pour les premiers éléments, un 1 a une valeur de 34.

Je veux faire la moyenne de chacun de 1, 1,5, 2 et 2,5, selon les valeurs qu'il a (données en b).

Ainsi, par exemple, un 2 a 45 en position 3, et 45 en position 5. Par conséquent, la moyenne est de 45 ans

Comment puis-je faire ce genre de chose bien dans R?

Répondre

2

Je suppose que a et b sont vraiment des vecteurs numériques plutôt que des listes - sinon, unlist pour les faire ainsi.

a <- c(1, 1.5, 2, 2.5, 2, 2.5, 1, 1.5, 1, 2.5) 
b <- c(34, 67, 45, 12, 45, 78, 90, 50, 60, 12) 
tapply(b,a,mean) 

Résultat:

 1  1.5  2  2.5 
61.33333 58.50000 45.00000 34.00000 
+0

ah désolé ben, n'a pas vu votre réponse avant le mien posté . btw, vous n'avez pas besoin d'utiliser 'list' – Ramnath

+1

parfait. je vais supprimer ma réponse pour éviter la duplication :) – Ramnath

1

Deux autres options, une de la base R et l'autre en plyr:

> aggregate(b, list(a), mean) 
    Group.1  x 
1  1.0 61.33333 
2  1.5 58.50000 
3  2.0 45.00000 
4  2.5 34.00000 
> library(plyr) 
> ddply(data.frame(a,b), "a", summarize, meanval = mean(b)) 
    a meanval 
1 1.0 61.33333 
2 1.5 58.50000 
3 2.0 45.00000 
4 2.5 34.00000