2012-07-13 91 views
4

是否有一個優雅的單行程(使用任何R包)來完成以下任務?創建總行的表格摘要

tab <- aggregate(. ~ Species, dat=iris, mean) 
total <- data.frame(Species='Overall', t(colMeans(iris[,-5]))) 
rbind(tab, total) 

回答

3

reshape2也許是有點滑頭這裏,得到它分爲兩個步驟:?

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

6

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 

但我騙了,並作了一個副本的例子幫助文件;)所以稱讚鄧肯默多克。

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 
+0

'fn $'插值非常棒。 – Ryogi 2012-07-14 22:18:06