我对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中是否有更有效的方法吗?
答案 0 :(得分:2)
我现在能看到的最大问题是你迭代地构建了一些数据结构,即source
,target
和corr
。您可以通过将对象预分配到正确的大小来极大地加速代码,并使用索引来放置值。
您可以通过矢量化操作来进一步改进代码。例如,确定m
的哪些部分大于0.01
可以很容易地完成:
m[m > 0.01]
并获取您的数据结构source
,target
和corr
:
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对您的代码的应用程序的回答。