我可以加快R中的迭代过程吗?

时间:2016-07-18 14:09:50

标签: r matrix iteration

我对R中的迭代缺乏经验,我希望加快一个过程,因为我正在网站中实施一些分析。

我发现了一个非常有用的教程,它允许我遍历一个矩阵,挑选出超过某个阈值(> 0.01)的标准数据,然后渗透三个向量:" source,target和corr"使用这些值最终可以构建一个组织良好的数据框。

source=c()
target=c()
corr<-c()

g1<-rownames(adj_mat)[1:dim(adj_mat)[1]]
g2<-g1

for(gene in g1){
  for(gen in g2){
    if(adj_mat[gene,gen]>0.01){
      source<-c(source,gene)
      target<-c(target,gen)
      corr<-c(corr,adj_mat[gene,gen])
    }
  }
}
network<-data.frame(source,target,corr)

虽然这对于尺寸为1000,500的小矩阵来说非常有用,但是对于尺寸为10000,700的尺寸,需要花费大量的时间......

矩阵来自一个文件,每次都会上传到网站上并在网站上阅读,因此我无法容纳这些来源等。&#39;对象大小为矩阵大小,因为每个新上传的文件大小不同。

有人能告诉我在R中是否有更有效的方法吗?

2 个答案:

答案 0 :(得分:2)

我现在能看到的最大问题是你迭代地构建了一些数据结构,即sourcetargetcorr。您可以通过将对象预分配到正确的大小来极大地加速代码,并使用索引来放置值。

您可以通过矢量化操作来进一步改进代码。例如,确定m的哪些部分大于0.01可以很容易地完成:

m[m > 0.01]

并获取您的数据结构sourcetargetcorr

matching_indices = which(m > 0.01, arr.ind = TRUE)
source = matching_indices[,1]
target  = matching_indices[,2]
corr = m[m > 0.01]

这只是示例代码,我不完全确定这是否是您所需要的。但它为此迈出了良好的一步。

答案 1 :(得分:2)

向量化对于编写高性能R非常重要。这允许尽可能多地在本机代码中完成工作,R和本机代码之间的值传输最少。

例如:

# Slow
a <- c(1, 2, 3)
b <- c(4, 5, 6)

r <- c()

for (i in 1:length(a)) {
    r <- c(r, a[i] + b[i]);
}

# Fast
r <- a + b

后者更快,因为方法调用+ 3次,每次迭代一次,而 fast 方法调用+一次。你应该尝试尽可能多地批量处理。这也是更短的代码!

但条件限制呢?假设你想要优化:

# Slow
a <- c(1, 2, 3)
b <- c(4, 5, 6)

r <- c()

for (i in 1:length(a)) {
    if (a[i] > b[i] / 2) {
        r <- c(r, a[i] + b[i]);
    } else {
        r <- c(r, a[i] - b[i]);
    }
}

您可以使用ifelse

# Fast
a <- c(1, 2, 3)
b <- c(4, 5, 6)

r <- ifelse(a > b / 2, a + b, a - b)

请查看@PaulHiemstra对您的代码的应用程序的回答。