【问题标题】:ddply super slow, how can I speed up my calculation? R code modification requested:ddply 超级慢,如何加快计算速度?请求修改 R 代码:
【发布时间】:2017-06-26 00:02:09
【问题描述】:

我有一个数据 (delisle) 和以下代码,我的大数据矩阵需要几天时间才能运行。 ddply 的替代品是什么?有人请指导或帮助吗?

TYPE  SAMPLE probeA probeB probeC 
CatA  52 1.2 3.2 3.4
CatA  52 2.2 4.2 3.4
CatA  58 1.5 6.5 7.8
CatA  58 8.3 6.5 9.5
CatA  94 1.5 4.3 6.4
CatB  52 2.2 2.2 3.4
CatB  58 2.5 4.5 6.8
CatB  58 6.2 6.0 5.3
CatB  94 2.5 5.3 6.4

我使用 ddply 为每个“SAMPLE”、每个探针计算了 catA 和 catB 之间的倍数变化。

输出应该是:

SAMPLE 探针 FC

52  probeA  mean(CatA)/mean(CatB)
52  probeB  mean(CatA)/mean(CatB)
58  probeA  mean(CatA)/mean(CatB)
58  probeB  mean(CatA)/mean(CatB)

对于大数据(20K 行和 5K 列),我的代码非常慢:

 probenames <- as.vector(colnames(delisle))

 for (i in 3:ncol(delisle))
 {
 probe = probenames[i]

 Stats <- function(gs) {

 typeA.sub <- gs[which(gs$TYPE=="CatA"),]
 typeB.sub <- gs[which(gs$TYPE=="CatB"),]
 fc.AB = mean(typeA.sub[,i])/mean(typeB.sub[,i])
 fc.AC = 
 fc.BC = 
 data.frame(probe,fc.AB, fc.AC, fc.BC)
 }
 output <- ddply(.data=delisle, .variables="SAMPLE", .progress=progress_text(style=3), Stats)
 write.table(output,"SAMPLETYPE.txt",quote=F,sep="\t",append=T,col.names=F)
 }

【问题讨论】:

  • 我无法运行您的代码。似乎缺少关键部分。例如,probnames 是什么?您可能希望创建一个可重现的最小示例,以便我们更好地了解您想要的输出。
  • probenames
  • 帮助任何人修改?
  • 您能否运行dput(df) 以轻松重现您的data.frame?

标签: r performance plyr


【解决方案1】:

这是否以快速的方式为您提供预期的结果?

library(tidyverse)
d %>% 
  select(-probeC) %>% 
  gather(key, value, -TYPE, -SAMPLE) %>% 
  group_by(SAMPLE, key, TYPE) %>% 
  summarise(a = mean(value)) %>% 
  spread(TYPE, a) %>% 
  mutate(res = CatA/CatB)

Source: local data frame [6 x 5]
Groups: SAMPLE, key [6]
  SAMPLE    key  CatA  CatB       res
   <int>  <chr> <dbl> <dbl>     <dbl>
1     52 probeA   1.7  2.20 0.7727273
2     52 probeB   3.7  2.20 1.6818182
3     58 probeA   4.9  4.35 1.1264368
4     58 probeB   6.5  5.25 1.2380952
5     94 probeA   1.5  2.50 0.6000000
6     94 probeB   4.3  5.30 0.8113208

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2021-11-17
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多