我想通过名为 data.frame
的标识符变量聚合 ensg
。数据框如下所示:
chromosome probeset ensg symbol XXA_00 XXA_36 XXB_00
1 X 4938842 ENSMUSG00000000003 Pbsn 4.796123 4.737717 5.326664
我想计算具有相同
ensg
值的行上每个数字列的平均值。这里的问题是我想保留其他身份变量染色体和符号不变,因为它们对于相同的 ensg
也是相同的。最后,我想要一个带有标识列
data.frame
、 chromosome
、 ensg
的 symbol
和具有相同标识符的行上的数字列的平均值。我在 ddply
中实现了这个,但与 aggregate
相比它非常慢:spec.mean <- function(eset.piece)
{
cbind(eset.piece[1,-numeric.columns],t(colMeans(eset.piece[,numeric.columns])))
}
t
mean.eset <- ddply(eset.consensus.grand,.(ensg),spec.mean,.progress="tk")
我的第一个聚合实现看起来像这样,
mean.eset=aggregate(eset[,numeric.columns], by=list(eset$ensg), FUN=mean, na.rm=TRUE);
并且要快得多。但是
aggregate
的问题是我必须重新附加描述变量。我还没有弄清楚如何将我的自定义函数与 aggregate
一起使用,因为 aggregate
不传递数据帧,而只传递向量。aggregate
有没有一种优雅的方法来做到这一点?或者有什么更快的方法可以用 ddply
做到这一点? 最佳答案
首先让我们定义一个玩具示例:
df <- data.frame(chromosome = gl(3, 10, labels = c('A', 'B', 'C')),
probeset = gl(3, 10, labels = c('X', 'Y', 'Z')),
ensg = gl(3, 10, labels = c('E1', 'E2', 'E3')),
symbol = gl(3, 10, labels = c('S1', 'S2', 'S3')),
XXA_00 = rnorm(30),
XXA_36 = rnorm(30),
XXB_00 = rnorm(30))
然后我们将
aggregate
与公式接口(interface)一起使用:df1 <- aggregate(cbind(XXA_00, XXA_36, XXB_00) ~ ensg + chromosome + symbol,
data = df, FUN = mean)
> df1
ensg chromosome symbol XXA_00 XXA_36 XXB_00
1 E1 A S1 -0.02533499 -0.06150447 -0.01234508
2 E2 B S2 -0.25165987 0.02494902 -0.01116426
3 E3 C S3 0.09454154 -0.48468517 -0.25644569
关于r - 用聚合解决 ddply 任务的优雅方法(希望有更好的性能),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8488023/