我很好奇是否有更快或更优雅的方法从这个数据集开始..
# generate some fake data
x <- mtcars[ , c( 1 , 2 , 8:11 ) ]
..并构建此表(带有整体、齿轮、圆柱和齿轮+圆柱突破)。请注意,这dcast
只会创建一组突破,而不是同时创建所有突破。sodcast
可用于单独创建第 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' )