通过内部应用改进for循环

时间:2014-02-04 10:41:10

标签: r

我有一个data.frame,按 mean 列排序,如下所示:

        10SE191_2  10SE207  10SE208     mean
7995783  12.64874 13.06391 12.69378 12.73937
8115327  12.69979 12.52285 12.41582 12.50363
8108370  12.58685 12.87818 12.66021 12.45720
7945680  12.46392 12.26087 11.77040 12.36518
7923547  11.98463 11.96649 12.50666 12.33138
8016718  12.81610 12.71548 12.48164 12.32703

我想将t.test应用于每一行,使用强度值作为输入:df[i,1:3]和强度较低的行的平均值值。例如,对于第一行,我想计算从第2行到第6行的df[1,1:3] vs _mean values_的t.test.我的代码使用 for循环但我目前的data.frame有超过20,000行和24列,需要很长时间。有任何改进代码的想法吗?

由于

代码:

temp <- matrix(-9, nrow=dim(matrix.order)[1], ncol=2) #create a result matrix
l <- dim(matrix.order)[1]
for (i in 1:l){
j <- 1+i
if (i < l | j +2 == l) { #avoid not enough y observations
mean.val <- matrix.order[j:l,4]
p <- t.test(matrix.order[i, 1:3], mean.val)
temp[i,1] <- p$p.value
   }
 else {temp[i,1] <- 1} 
 }
dput

df

structure(list(`10SE191_2` = c(12.6487418898415, 12.6997932097351,12.5868508174491, 12.4639169398277, 11.9846348627906, 12.8160978540904), `10SE207` = c(13.0639063105224, 12.522848114011, 12.8781769160682, 12.260865493177, 11.9664905651469, 12.7154788700468), `10SE208` = c(12.6937808736673, 12.4158248856386, 12.6602128982717, 11.7704045448312, 12.5066604109231, 12.4816357798965), mean = c(12.7393707471856, 12.5036313008127, 12.4572035036992, 12.3651842840775, 12.3313821056582, 12.3270331271091)), .Names = c("10SE191_2", "10SE207", "10SE208", "mean"), row.names = c("7995783", "8115327", "8108370", "7945680", "7923547", "8016718"), class = "data.frame")

2 个答案:

答案 0 :(得分:3)

您可以使用以下命令获取所有p值(如果可能):

apply(df, 1, function(x) {
  y <- df$mean[df$mean < x[4]] 
  if(length(y) > 1)
    t.test(x[1:3], y)$p.value
  else NA
})

如果NA没有足够的值,该函数将返回y

   7995783    8115327    8108370    7945680    7923547    8016718 
0.08199794 0.15627947 0.04993244 0.50885253         NA         NA 

答案 1 :(得分:1)

运行2E4 t.test可能需要花费很多时间。尝试使用Rprof查找热点。您可能还想使用mcapply或类似的并行处理工具,因为您对每行的分析独立于所有其他数据(这意味着这是一项非常适合多核并行处理的任务)。