最近在优化一个R实现的功能网络分析方法,有以下体会:
1:R中,利用booler值进行矩阵下标索引可以帮助我们极大地提高程序效率:大部分作用于matrix的for while循环
都可转化成矩阵的booler值索引相关运算。例如:
矩阵A有10000行,2列。若用for进行相应行的前后置换:
A<-matrix(c(sample(1:10000,10000),sample(1:10000,10000)),ncol=2,byrow=T)
B<-A
proc.time()->t1
for(i in 1:nrow(A)){
if(A[i,1]>A[i,2]) A[i,]<-A[i,c(2,1)]}
proc.time()->t2
t2-t1
用户 系统 流逝
0.13 0.02 0.14
若写成:
proc.time()->t1
B[B[,1]>B[,2],]<-B[B[,1]>B[,2],c(2,1)]
proc.time()->t2
10000行时两种方法都很快,差别也只有0.08秒,但是当行数为100000时,差别就会达到0.5秒
2:对矩阵的操作尽量用apply家族函数。
3:若无必要,勿增实体----奥卡姆剃刀法则在任何地方都是你要考虑到的。
另外有一个剔除重复二元相互作用对的方法,记下来:
假设二元相互作用对存储在matrix A中,二元相互作用对是无序的(a<->b,b<->a同时存在).
首先,按A的第一列排序整个matrix:
A[order(A[,1]),]->A
然后去重:
A<-unique(A)
然后用一个统一的规则(大于或小于都可以)重新放置每个相互作用对:
A[A[,1]>A[,2],]<-A[A[,1]>A[,2],c(2,1)] #if(A[i,1]<A[i,2]) A[i,]<-A[i,c(2,1)]} is OK
再unique一次:
A<-unique(A)
就可以达到效果。
4:注意R中的逻辑运算符:
R 中存在两类逻辑运算符:短形式运算符& | !和长形式运算符&& ||,具体说明见help
我们一般需要的是短形式的运算符。