是否有优雅的单线(使用任何R包)来完成以下任务?
tab <- aggregate(. ~ Species, dat=iris, mean)
total <- data.frame(Species='Overall', t(colMeans(iris[,-5])))
rbind(tab, total)
Run Code Online (Sandbox Code Playgroud)
包 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
Run Code Online (Sandbox Code Playgroud)
但我作弊并在帮助文件中略微复制了这个例子;)因此归功于Duncan Murdoch.
或者在 sqldf
library(sqldf)
Run Code Online (Sandbox Code Playgroud)
库(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"
)
Run Code Online (Sandbox Code Playgroud)
这可以像这样写得更紧凑:
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")
Run Code Online (Sandbox Code Playgroud)
给
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
Run Code Online (Sandbox Code Playgroud)