R 代码优化

最近在优化一个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
t2-t1
用户 系统 流逝
0.06 0.00 0.06
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
我们一般需要的是短形式的运算符。

posted on 2012-03-05 15:20 ewre 阅读(482) 评论(0)  编辑 收藏 引用 所属分类: R


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2012年3月>
26272829123
45678910
11121314151617
18192021222324
25262728293031
1234567

留言簿(2)

文章分类

文章档案

最新评论

阅读排行榜