【发布时间】:2020-04-14 22:54:51
【问题描述】:
我正在循环处理一个特殊对象——来自 Matrix_eQTL 的 SliceData 对象,我想知道它是否可以被“应用”中的任何函数重写。
让我通过一个玩具例子来解释它。首先,我通过以下脚本创建玩具数据。
library(MatrixEQTL)
set.seed(5)
gene_mat = matrix(data = rnorm(200000, mean=50, sd=10), nrow = 2000, ncol = 100)
gene = SlicedData$new(gene_mat);
gene$ResliceCombined(200)
这里我有一个自定义函数invnorm。
invnorm <- function(expression){
return(qnorm((rank(expression, na.last="keep") - 0.5)/sum(!is.na(expression))))
}
而我想要做的是将这个invnorm 应用到gene 对象的每个切片的每一行上,这可以通过以下脚本实现
for( sl in 1:length(gene) ){
mat = gene[[sl]]
mat = t(apply(mat, 1, invnorm))
gene[[sl]] = mat
}
那么有没有办法通过apply 函数族中的任何函数重写这个循环?提前谢谢你。
【问题讨论】:
-
如果这是可重现的会更容易。正如
lapply(gene, function (x) t(apply(x, 1, invnorm))应该做得很好。 -
好主意!添加了一个玩具示例。我可以在正式的解决方案中提出您的建议,以便我可以投票并接受它吗?非常感谢!
-
这个包使用 S4 类,这意味着通常的
lapply不起作用。好消息是你的 for 循环应该和使用lapply一样快。另外,使用 for 循环并不丢人,因为它们主要是为了可读性。 -
你透露了我的想法——我只是因为使用 for 循环而感到羞耻,哈哈。非常感谢您的清晰解释!您介意将您的评论复制到答案中以便我接受吗?