小编Joh*_*nes的帖子

用聚合解决ddply任务的优雅方法(希望获得更好的性能)

我想data.frame通过一个名为变量的标识符变量来聚合ensg.数据框如下所示:

  chromosome probeset               ensg symbol    XXA_00    XXA_36    XXB_00
1          X  4938842 ENSMUSG00000000003   Pbsn  4.796123  4.737717  5.326664
Run Code Online (Sandbox Code Playgroud)

我想计算具有相同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")
Run Code Online (Sandbox Code Playgroud)

我的第一个聚合实现看起来像这样,

mean.eset=aggregate(eset[,numeric.columns], by=list(eset$ensg), FUN=mean, na.rm=TRUE);
Run Code Online (Sandbox Code Playgroud)

并且要快得多.但问题aggregate是我必须重新描述描述变量.我还没有弄清楚如何使用我的自定义函数,aggregate因为aggregate它不传递数据帧而只传递矢量.

是否有一种优雅的方式来做到这一点aggregate?或者有更快的方法来做到这一点ddply

aggregate r plyr

7
推荐指数
2
解决办法
1992
查看次数

如何使用Reduce从函数列表中创建新函数?

我想添加一些函数f1,f2,...,fn,这样我就有了一个新函数,它产生f(x)= f1(x)+ ... + fn(x)(称为逐点加法).所以我有一个功能列表并尝试过

Reduce("funadd",fun.list)
Run Code Online (Sandbox Code Playgroud)

funadd定义的地方

funadd <- function(f1,f2){
    retfun <- function(x){
        f1(x)+f2(x)
    }
    retfun
}
Run Code Online (Sandbox Code Playgroud)

在两个函数上测试funadd时,它可以完美运行.但是,当我尝试评估Reduce命令的结果时,我收到错误

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Run Code Online (Sandbox Code Playgroud)

reduce r

3
推荐指数
2
解决办法
605
查看次数

标签 统计

r ×2

aggregate ×1

plyr ×1

reduce ×1