Mehrere Funktionen in einem einzigen tapply oder aggregate-Anweisung

Ist es möglich, zwei Funktionen in einem einzigen tapply oder aggregate-Anweisung?

Unten habe ich zwei tapply Aussagen und zwei zusammengefasste Aussagen: eine für mittlere und eine für SD.
Ich würde es bevorzugen, kombinieren Sie die Anweisungen.

my.Data = read.table(text = "
  animal    age     sex  weight
       1  adult  female     100
       2  young    male      75
       3  adult    male      90
       4  adult  female      95
       5  young  female      80
", sep = "", header = TRUE)

with(my.Data, tapply(weight, list(age, sex), function(x) {mean(x)}))
with(my.Data, tapply(weight, list(age, sex), function(x) {sd(x)  }))

with(my.Data, aggregate(weight ~ age + sex, FUN = mean)
with(my.Data, aggregate(weight ~ age + sex, FUN =   sd)

# this does not work:

with(my.Data, tapply(weight, list(age, sex), function(x) {mean(x) ; sd(x)}))

# I would also prefer that the output be formatted something similar to that 
# show below.  `aggregate` formats the output perfectly.  I just cannot figure 
# out how to implement two functions in one statement.

  age    sex   mean        sd
adult female   97.5  3.535534
adult   male     90        NA
young female   80.0        NA
young   male     75        NA

Ich kann immer führen Sie zwei separate Anweisungen, und führen Sie die Ausgabe. Ich habe nur gehofft, es könnte
eine etwas mehr bequeme Lösung.

Fand ich die Antwort weiter unten gepostet hier: Übernehmen mehrere Funktionen zum Spalte mit tapply

f <- function(x) c(mean(x), sd(x))
do.call( rbind, with(my.Data, tapply(weight, list(age, sex), f)) )

Jedoch weder die Zeilen oder Spalten sind beschriftet.

     [,1]     [,2]
[1,] 97.5 3.535534
[2,] 80.0       NA
[3,] 90.0       NA
[4,] 75.0       NA

Ich würde lieber eine Lösung in der Basis R. Eine Lösung aus der plyr Paket gepostet wurde unter dem link oben. Wenn ich die richtigen Zeilen-und Spaltenüberschriften, um die Ausgabe oben, wäre es perfekt.

InformationsquelleAutor der Frage Mark Miller | 2013-03-05

Schreibe einen Kommentar