带有强制转换的自动列名标签

时间:2012-07-05 23:14:46

标签: r reshape

使用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)。这可能吗?

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

3 个答案:

答案 0 :(得分: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....

答案 1 :(得分:3)

对于您的示例中的简单重塑,您只需在基数R中使用aggregate,它可以执行您想要的操作,而无需指定列名称:

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
 .....

答案 2 :(得分:1)

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

dcast (mtcars, cyl + hp ~ "colname", mean)