2010-01-05 3 views
0

La fonction cast() est grande au calcul des marges des valeurs globales:Puis-je faire des calculs de marge dans ddply()?

cast(df, IDx1+IDx2~IDy1, margins=c('IDx1','IDx2','grand_row'),c(min, mean, max))

Le problème est que je dois poids mes moyens utilisant un second vecteur et une fonction personnalisée.

Bien sûr, ddply() me permet d'appliquer des fonctions d'agrégation personnalisée à mes dossiers regroupés:

ddply(d, IDx1+IDx2~IDy1 , function(x) 
c(
min(x$value), 
MyFancyWeightedHarmonicMeanFunction(x$value,x$weight), 
max(x$value) 
) 
) 

... et c'est génial.

Mais ce serait vraiment sauver la journée est la possibilité de faire les deux choses à la fois, que ce soit en appelant la fonction de deux vecteurs dans cast() ou en feignant d'une certaine manière la variable margins=() dans ddply().

Est-ce possible?

Répondre

2

Il est assez pour calculer les marges vous:

ddply(d, "IDX1", ...) 
ddply(d, c("IDX1", "IDX2"), ...) 
ddply(d, "IDy1", ...) 

puis combiner les résultats avec rbind. Il ne serait pas trop difficile d'en faire une fonction générale.

Aussi, je réécris votre code original:

ddply(d, IDx1+IDx2~IDy1, summarise, 
    min = min(value), 
    wt.mean = MyFancyWeightedHarmonicMeanFunction(value, weight), 
    max = max(value) 
) 
+0

Hadley, Merci pour le conseil. Les opérations ddply séparées, assemblées, sont exactement ce que j'ai fait. J'ai toujours la tête qui résume et transforme. –

+0

'rbind.fill' est particulièrement utile lorsque ddply renvoie des trames de données avec des nombres de colonnes différents. – Andrew