我很好奇是否有更快或更优雅的方法来开始这个数据集。
# 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')