以下を達成するためのエレガントなワンライナー (任意の R パッケージを使用) はありますか?
tab <- aggregate(. ~ Species, dat=iris, mean)
total <- data.frame(Species='Overall', t(colMeans(iris[,-5])))
rbind(tab, total)
パッケージtables
library(tables)
tabular( (Species + 1) ~ All(iris)*(mean),data=iris)
> tabular( (Species + 1) ~ All(iris)*(mean),data=iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width
Species mean mean mean mean
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026
All 5.843 3.057 3.758 1.199
しかし、私はごまかして、ヘルプ ファイルの例を少しだけコピーしました ;) Duncan Murdoch の功績によるものです。
またはでsqldf
library(sqldf)
ライブラリ (sqldf)
sqldf("
select Species,
avg(Sepal_Length) `Sepal.Length`,
avg(Sepal_Width) `Sepal.Width`,
avg(Petal_Length) `Petal.Length`,
avg(Petal_Width) `Petal.Width`
from iris
group by Species
union all
select 'All',
avg(Sepal_Length) `Sepal.Length`,
avg(Sepal_Width) `Sepal.Width`,
avg(Petal_Length) `Petal.Length`,
avg(Petal_Width) `Petal.Width`
from iris"
)
これは、次のようにもう少しコンパクトに書くことができます。
variables <- "avg(Sepal_Length) `Sepal.Length`,
avg(Sepal_Width) `Sepal.Width`,
avg(Petal_Length) `Petal.Length`,
avg(Petal_Width) `Petal.Width`"
fn$sqldf(" select Species, $variables from iris group by Species
union all select 'All', $variables from iris")
与える
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006000 3.428000 1.462 0.246000
2 versicolor 5.936000 2.770000 4.260 1.326000
3 virginica 6.588000 2.974000 5.552 2.026000
4 All 5.843333 3.057333 3.758 1.199333
パッケージreshape2
はおそらくここでは少し洗練されており、2 つのステップに分かれています。
library(reshape2)
iris.m <- melt(iris, id.vars = "Species")
dcast(Species ~ variable, data = iris.m, fun.aggregate = mean, margins = "Species")
#-----
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006000 3.428000 1.462 0.246000
2 versicolor 5.936000 2.770000 4.260 1.326000
3 virginica 6.588000 2.974000 5.552 2.026000
4 (all) 5.843333 3.057333 3.758 1.199333
?dcast の margins 引数の詳細を参照してください