这个问题有多个步骤,所以请耐心等待。
前提 我创建的脚本重新编码了一个包含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:重申前提更明确
答案 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