如何使这个R循环更有效?

时间:2016-01-19 17:26:23

标签: r performance processing-efficiency

我有一组实际值(> 50k),对于每一个,我想看看该网站的置换的比例大于观察到的值。我使用以下for循环解决了这个问题,但似乎运行缓慢,我想知道是否有人有建议来优化它或更有效的方法。

提前致谢!

在此代码中,real [,3]对应于实数值的向量,matrix是结果输出,perm [,3]包含所有置换值。

for (i in 1:nrow(real)) {
  real[i,3] -> output[i,1]
  subset(perm, perm[,1] == row.names(real[i,])) -> sims
  nrow(sims[sims[,3] > significance[i,1],] ) -> output[i,3]
  nrow(sims) -> output[i,2]
}

真实文件的负责人:只有第3列对此

很重要
chr10_1012663  134.1894  130.9915 -3.197876e+00 -2.411963e-02        0
chr10_1012716  144.3250  130.9433 -1.338170e+01 -9.730331e-02        0
chr10_10160551 155.6744  138.7002 -1.697420e+01 -1.154519e-01        0
chr10_10163175 304.4715  261.5272 -4.294435e+01 -1.520394e-01        0
chr10_1018272  133.0447  133.0447 -8.930860e-08 -6.712676e-10        0

perm文件的负责人:只有第3列也很重要。此文件包含真实文件中每个站点的50个排列。

chr10_1012663  99.94432 130.9915  3.104717e+01  2.705191e-01  1
chr10_1012716 130.94332 130.9433 -3.600817e-08 -2.749906e-10  0
chr10_10160551 138.63097 138.7002  6.921823e-02  4.991739e-04  1
chr10_10163175 261.52720 261.5272  4.579061e-08  1.750893e-10  1

输出文件的头部:列是(i)实际值,(ii)得分的数量,以及(iii)大于实际值的排列数。

-3.197876e+00   50   39 
-9.730331e-02   50   44 
-1.154519e-01   50   48 
-1.520394e-01   50   49  
-6.712676e-10   50   38

1 个答案:

答案 0 :(得分:0)

编辑:主要帖子已更改,因此我编辑了一些内容以便匹配。

如果您循环遍历real的所有行,那么您也可以一次性将矢量real[,3]分配给output[,1]

output[,1] <- real[,3]

由于您总是有50个排列,因此您只需将50分配给output[,2]

output[,2] <- 50

接下来,您尝试在real中找到与perm中第一列的值相匹配的行名称,并将perm中的相应行存储在sims中。我建议不要在行名中存储信息,但即使你这样做,也有更好的方法(见下文)。由于您之后只使用sims[,3],因此您可能只会将perm中的第3列进行子集化。

sims <- sapply(row.names(real), function(x) perm[perm[,1] == x, 3])
for (i in 1:nrow(real)) output[i,3] <- length(sims[[i]][sims[[i]] > significance[i,1]])