R -将总数加上多个分组结果叠加到单个输出表中的惯用方法



我很好奇是否有更快或更优雅的方法来开始这个数据集。

# generate some fake data
x <- mtcars[ , c( 1 , 2 , 8:11 ) ]

. .并构建这个表(与整体,齿轮,周期和齿轮+周期突破)。注意,dcast只创建一组爆发,而不是一次创建所有爆发。因此,dcast可用于单独创建第1、2 -4、5 -7和8 -15行,而不是堆叠在一起。

   overall gear cyl 0_0_2 0_0_3 0_0_4 0_1_2    0_1_4 0_1_6 0_1_8    1_0_1 1_0_2 1_0_4 1_1_1 1_1_2
1        1   NA  NA 17.15  16.3 12.62    26 19.26667  19.7    15 20.33333  23.6  18.5  29.1  27.4
2        1   NA   4   NaN   NaN   NaN    26      NaN   NaN   NaN 21.50000  23.6   NaN  29.1  27.4
3        1   NA   6   NaN   NaN   NaN   NaN 21.00000  19.7   NaN 19.75000   NaN  18.5   NaN   NaN
4        1   NA   8 17.15  16.3 12.62   NaN 15.80000   NaN    15      NaN   NaN   NaN   NaN   NaN
5        1    3  NA 17.15  16.3 12.62   NaN      NaN   NaN   NaN 20.33333   NaN   NaN   NaN   NaN
6        1    4  NA   NaN   NaN   NaN   NaN 21.00000   NaN   NaN      NaN  23.6  18.5  29.1  25.9
7        1    5  NA   NaN   NaN   NaN    26 15.80000  19.7    15      NaN   NaN   NaN   NaN  30.4
8       NA    3   4   NaN   NaN   NaN   NaN      NaN   NaN   NaN 21.50000   NaN   NaN   NaN   NaN
9       NA    3   6   NaN   NaN   NaN   NaN      NaN   NaN   NaN 19.75000   NaN   NaN   NaN   NaN
10      NA    3   8 17.15  16.3 12.62   NaN      NaN   NaN   NaN      NaN   NaN   NaN   NaN   NaN
11      NA    4   4   NaN   NaN   NaN   NaN      NaN   NaN   NaN      NaN  23.6   NaN  29.1  25.9
12      NA    4   6   NaN   NaN   NaN   NaN 21.00000   NaN   NaN      NaN   NaN  18.5   NaN   NaN
13      NA    5   4   NaN   NaN   NaN    26      NaN   NaN   NaN      NaN   NaN   NaN   NaN  30.4
14      NA    5   6   NaN   NaN   NaN   NaN      NaN  19.7   NaN      NaN   NaN   NaN   NaN   NaN
15      NA    5   8   NaN   NaN   NaN   NaN 15.80000   NaN    15      NaN   NaN   NaN   NaN   NaN

这是我的解决方案,但我想知道是否有一个更聪明的方法来做这样的事情没有我笨重的函数定义。谢谢!

# program start
library(reshape2)
library(plyr)
# load your real data here
x$overall <- 1
# define a make-table function that quickly creates overall, cyl, gear, and gear+cyl-level tables using any value and any function
mt <-
    function( x , fun , var ){
        out <-
            rbind.fill(
                dcast( x , overall ~ vs + am + carb , fun , value.var = var ) ,
                dcast( x , overall + cyl ~ vs + am + carb , fun , value.var = var ) ,
                dcast( x , gear + overall ~ vs + am + carb , fun , value.var = var ) ,
                dcast( x , gear + cyl ~ vs + am + carb , fun , value.var = var )
            )
        nsm <- c( 'overall' , 'gear' , 'cyl' )
        out[ , c( 'overall' , 'gear' , 'cyl' , names( out )[ !( names( out ) %in% nsm ) ] ) ]
    }
    # make a table of the defined structure, calculating the mean of the mpg column
mt( x , mean , 'mpg' )

感谢@hadley,正是我想要的

x <- mtcars[ , c( 1 , 2 , 8:11 ) ]
library(reshape2)
y <- add_margins( x , vars = c( 'gear' , 'cyl' ) )
dcast( y , gear + cyl ~ vs + am + carb , mean , value.var = 'mpg' )

这是你的代码的一个更通用的版本:

mt <- function(data, y, x, fun, var) {
  formulas <- paste(y, "~", x)
  casts    <- lapply(formulas, dcast, data = data, fun.aggregate = fun,
                                      value.var = var)
  out      <- rbind.fill(casts)
  nsm <- unique(unlist(strsplit(y, '\s?\+\s?')))
  out[, c(nsm, setdiff(names(out), nsm))]
}
mt(data = x,
   y    = c("overall", "overall + cyl", "gear + overall", "gear + cyl"),
   x    = "vs + am + carb",
   fun  = mean,
   var  = 'mpg')

相关内容

  • 没有找到相关文章

最新更新