加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 20:12:50 所属栏目:百科 来源:网络整理
导读:我想通过一个名为ensg的标识符变量来聚合data.frame.数据框如下所示: chromosome probeset ensg symbol XXA_00 XXA_36 XXB_001 X 4938842 ENSMUSG00000000003 Pbsn 4.796123 4.737717 5.326664 我想计算具有相同ensg值的行上每个数字列的平均值.这里的问题
我想通过一个名为ensg的标识符变量来聚合data.frame.数据框如下所示:
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,具有相同标识符的行上的数字列的染色体,ensg,符号和平均值.我在ddply中实现了这个,但与聚合相比它非常慢:

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);

并且要快得多.但聚合的问题是我必须重新附加描述变量.我没有想出如何使用我的自定义函数与聚合,因为聚合不传递数据帧,但只传递矢量.

使用聚合有一种优雅的方法吗?或者使用ddply有更快的方法吗?

首先让我们定义一个玩具示例:
df <- data.frame(chromosome = gl(3,10,labels = c('A','B','C')),probeset = gl(3,labels = c('X','Y','Z')),ensg =  gl(3,labels = c('E1','E2','E3')),symbol = gl(3,labels = c('S1','S2','S3')),XXA_00 = rnorm(30),XXA_36 = rnorm(30),XXB_00 = rnorm(30))

然后我们使用公式接口的聚合:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读