提高R重新编码任务的速度

时间:2013-02-22 01:41:24

标签: r python-2.7

这个问题有多个步骤,所以请耐心等待。

前提 我创建的脚本重新编码了一个包含43000列的电子表格,每个列都有一个包含177个观察值的唯一变量。观察结果都是不同的,是十进制数。

然后将每个单独的变量重新编码为两组;基于截止点。这个截止点是从我之前编写的脚本生成的。有一个与EACH变量/列相关的截止点 - 因此截止值是唯一的,并且来自43000个截止数字的列表。在此基础上,该列中的数字随后被重新编码为两组; 1或0 - 取决于它们是否>或者<。见下面的例子:

到目前为止,我是如何使用R plyr软件包的,例如:

Genedata$SPOCK1.202363_at_recode[Genedata$SPOCK1.202363_at<= 8.2244399999999995] <- "0"
Genedata$SPOCK1.202363_at_recode[Genedata$SPOCK1.202363_at> 8.2244399999999995] <- "1"
Genedata_Recoded$SPOCK1.202363_at_recode <- factor(Genedata$SPOCK1.202363_at_recode)

在这个例子中,变量是:SPOCK1.202363_at,截止值是8.2244399999999995

但是,鉴于变量名和cutoff都随每个变量而变化,我不知道如何在R中使用apply函数。

因此,我目前正在使用PyPer一个可以调用R函数的Python模块。使用占位符%s,我迭代地替换每个变量名称和截止值。

问题

1)目前打开CSV文件需要很长时间 - &gt;我认为保存为二进制文件或矩阵会加快速度。但这不是优先事项。

2)迭代;有没有办法使用plyr包使用recode函数将apply函数与两个更改变量一起使用。

3)迭代所需的当前时间似乎与变量非线性增加。对于1000个变量,它需要大约30秒,但对于43000,它似乎放慢了速度。我不知道原因。也许是一个解释?

4)有没有办法使用多处理包轻松并行化迭代任务,从而进一步提高速度

更新:为了回答“0”和“1”的原因,数字或非数字无关紧要。我只是选择了那个。最终,我的分析的下一部分需要两组,无论是否为数字并处理它。

更新2:重申前提更明确

1 个答案:

答案 0 :(得分:1)

想法#1:为什么不:

Genedata$SPOCK1.202363_at_recode <- factor( Genedata$SPOCK1.202363_at <= 8.2244399999999995, 
                                      labels=c("0", "1") )

这样你就不需要两次处理不等式了。如果您可以将其作为逻辑向量接受,则可以跳过factor调用:

Genedata$SPOCK1.202363_at_recode <-  Genedata$SPOCK1.202363_at <= 8.2244399999999995

创意#2:对于名为“X”的矩阵,对于多行,这肯定会更快:

X <- (X < rep( colMeans(X), each=nrow(X) ) )

你可以这样做:

Genedata[ , cols_to_process] <- ( Genedata[ , cols_to_process] < 
                                  rep( cutoff_vector, 
                                         each=nrow(Genedata[ , cols_to_process]) ) )

请注意,这实际上是@ flodel的评论建议,因为他将列转换为行并依赖于参数回收,然后恢复原始结构。关于并行化选项,我不认为这个相当小的数据集可以保证这一努力。在一台5岁的机器上花了大约3分钟:

 dfrm <- data.frame(matrix(rnorm(43000*170), 170) )
 cutoff <- rnorm(43000, 0, 0.2)
 system.time( dfrm[ , 1:43000] <- ( dfrm[ , 1:43000] < 
                                   rep( cutoff, 
                                          each=170 ) ) )
#   user  system elapsed 
#129.052  57.449 185.660 

转换为矩阵可能会大大提高速度:

 mtx <- matrix(rnorm(43000*170), 170) 
 system.time( mtx <- t(1*(t(mtx) > cutoff) )  )
 #  user  system elapsed 
 # 0.226   0.133   0.358 
 mtx <- matrix(rnorm(43000*170), 170)
 system.time( mtx[ , 1:43000] <- ( mtx[ , 1:43000] < 
                                   rep( cutoff, 
                                          each=170 ) ) )
 #  user  system elapsed 
 # 0.852   0.001   0.849 
 #Now do it all at once............
 system.time( mtx <- mtx < rep( cutoff, each=170 ) ) 
  # user  system elapsed 
  #0.095   0.000   0.094