1つのtapplyまたはaggregateステートメントに2つの関数を含めることは可能ですか?
以下では、2つのtapplyステートメントと2つのaggregateステートメントを使用します。1つは平均用、もう1つは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
いつでも2つの別々のステートメントを実行して、出力をマージできます。もう少し便利な解決策があるのではないかと思っていました。
私はここに投稿された以下の答えを見つけました: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
ます。パッケージのソリューションは上のリンクに投稿されました。上記の出力に正しい行と列の見出しを追加できれば、それは完璧です。