我想通过名为 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.framechromosomeensgsymbol 和具有相同标识符的行上的数字列的平均值。我在 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/

10-12 19:53