Можно ли включить две функции в одно выражение или обобщенную инструкцию?
Ниже я использую два оператора tapply и два агрегатных оператора: один для среднего и один для SD.
Я бы предпочел объединить утверждения.
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
Я всегда могу запускать два отдельных оператора и объединять выходные данные. Я просто надеялся, что может быть немного более удобное решение.
Я нашел приведенный ниже ответ: Применить несколько функций к столбцу, используя tapply
f <- function(x) c(mean(x), sd(x))
do.call( rbind, with(my.Data, tapply(weight, list(age, sex), f)) )
Однако ни строки, ни столбцы не помечены.
[,1] [,2]
[1,] 97.5 3.535534
[2,] 80.0 NA
[3,] 90.0 NA
[4,] 75.0 NA
Я предпочел бы решение в базе R. Решение из пакета plyr
было опубликовано по ссылке выше. Если я могу добавить правильные заголовки строк и столбцов к указанному выше выводу, это будет идеально.