【发布时间】:2017-08-13 11:21:33
【问题描述】:
像问题一样,我想分配在R中由lapply和tapply处理的列名。一个简单的例子:
df<-data.frame('X1'=rnorm(100),
'X2'=rnorm(100),
'X3'=c(c(rep('A',50)),c(rep('B',50))))
var<-c('X1','X2')
plyr::ldply(lapply(var, function(v) {
tapply(df[,v],df$X3,mean)
}),rbind)
这将导致:
A B
1 -0.06856352 0.08608197
2 -0.23585510 0.01551267
从中我无法判断第 1 行是来自“X1”还是“X2”。我想要的是:
A B
X1 -0.06856352 0.08608197
X2 -0.23585510 0.01551267
虽然我们可以在此示例中进行简单的手动检查并大胆猜测第 1 行来自“X1”,但是当变量更多且函数比平均值复杂得多时,这将变得乏味和冒险。
有人知道如何实现吗?您的时间和知识将不胜感激。提前致谢。
【问题讨论】:
-
为什么不只是
aggregate(. ~ X3, df, mean)或t(aggregate(. ~ X3, df, mean)[,-1])? -
或
group_by(df, X3) %>% summarise_each(funs(mean)) -
感谢 Sotos 和 coffeinjunky,你们的两位 cmets 让我离我想要的解决方案更近了一步。聚合、group_by、summarise_each 函数为我提供了处理此类问题的新工具,我太沉迷于应用函数了。