我有一组实际值(> 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
答案 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]])