Posso fare calcoli di margine in ddply ()?
Domanda
La funzione cast()
è grande a calcolare i margini per valori aggregati:
cast(df, IDx1+IDx2~IDy1, margins=c('IDx1','IDx2','grand_row'),c(min, mean, max))
Il problema è che ho bisogno di peso il mio mezzo utilizzando un secondo vettore e una funzione personalizzata.
Naturalmente, ddply()
mi permette di applicare funzioni di aggregazione personalizzata per i miei record raggruppati:
ddply(d, IDx1+IDx2~IDy1 , function(x)
c(
min(x$value),
MyFancyWeightedHarmonicMeanFunction(x$value,x$weight),
max(x$value)
)
)
... e questo è impressionante.
Ma cosa sarebbe davvero salvare il giorno è la possibilità di fare entrambe le cose contemporaneamente, sia chiamando la funzione a due vettore in cast()
o falsificare qualche modo la variabile margins=()
in ddply().
È possibile?
Soluzione
E 'abbastanza per calcolare i margini di te stesso:
ddply(d, "IDX1", ...)
ddply(d, c("IDX1", "IDX2"), ...)
ddply(d, "IDy1", ...)
e quindi combinare i risultati insieme a rbind
. Non sarebbe troppo difficile da avvolgere questo in una funzione generale.
Inoltre, mi piacerebbe riscrivere il codice originale come:
ddply(d, IDx1+IDx2~IDy1, summarise,
min = min(value),
wt.mean = MyFancyWeightedHarmonicMeanFunction(value, weight),
max = max(value)
)