9

使用 reshape::cast 时,有没有办法设置结果列的名称?

例子:

library(reshape)
data(mtcars)
cast(mtcars, cyl + hp ~ .,mean)

   cyl  hp (all)
1    4  52     2
2    4  62     2
3    4  65     1
4    4  66     1
5    4  91     2

而不是(all),我希望能够在对 cast 的调用中设置名称。这可能吗?

我知道,我知道,好像打字colnames(x)[3] <- "Foo"太难了,但如果你必须经常这样做,那就太费时间了!

4

3 回答 3

6

创建一个新的包装器,提供您寻求的设施(这意味着我找不到可以做到这一点的现有参数):

bcast <- function(... , agg.name =NA){ res <- cast(...)
             if(!is.na(agg.name)){ names(res)[length(res)] <- agg.name } 
             res}
bcast(mtcars, cyl + hp ~ . ,  fun.aggregate= mean, agg.name="test")

#--------
#Using carb as value column.  Use the value argument to cast to override this choice
#   cyl  hp test
1    4  52    2
2    4  62    2
3    4  65    1
4    4  66    1
5    4  91    2
6    4  93    1
7    4  95    2
snipped output....
于 2012-07-06T04:10:48.690 回答
3

对于示例中的简单整形,您可以简单地aggregate在 base R 中使用,它可以执行您想要的操作,而无需指定列名:

aggregate(carb~cyl+hp, mtcars, FUN=mean)

   cyl  hp carb
1    4  52    2
2    4  62    2
3    4  65    1
4    4  66    1
5    4  91    2
.....

或在所有列上:

aggregate(.~cyl+hp, mtcars, FUN=mean)

   cyl  hp      mpg     disp     drat       wt     qsec        vs        am     gear carb
1    4  52 30.40000  75.7000 4.930000 1.615000 18.52000 1.0000000 1.0000000 4.000000    2
2    4  62 24.40000 146.7000 3.690000 3.190000 20.00000 1.0000000 0.0000000 4.000000    2
3    4  65 33.90000  71.1000 4.220000 1.835000 19.90000 1.0000000 1.0000000 4.000000    1
4    4  66 29.85000  78.8500 4.080000 2.067500 19.18500 1.0000000 1.0000000 4.000000    1
5    4  91 26.00000 120.3000 4.430000 2.140000 16.70000 0.0000000 1.0000000 5.000000    2
 .....
于 2012-07-06T08:21:12.337 回答
1

reshape::cast无法设置默认列名,但可以设置(无论如何reshape2::dcast您都可以使用它,因为它更快)。使用您的示例:

dcast (mtcars, cyl + hp ~ "colname", mean)
于 2013-11-19T23:10:17.137 回答