1

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

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

然后将每个单独的变量重新编码为两组;基于截止点。这个截止点是根据我之前编写的脚本生成的。每个变量/列都有一个截止点 - 因此截止点是唯一的,并且来自 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

但是,鉴于变量名称和截止值都随每个单独的变量而变化,我不知道如何apply在 R 中使用该函数。

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

问题

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

2)迭代;有没有办法通过使用 plyr 包的 recode 函数来使用具有两个变化变量的 apply 函数。

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

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

更新:针对为什么“0”和“1”,数字或非数字无关紧要。我就是这么选的。最终,我分析的下一部分采用两组,无论是否为数字并处理它。

更新 2:改写前提更清楚

4

1 回答 1

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 
于 2013-02-22T06:37:20.427 回答