【问题标题】:Using functions of apply in R for implicit object在 R 中使用 apply 函数处理隐式对象
【发布时间】: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 循环而感到羞耻,哈哈。非常感谢您的清晰解释!您介意将您的评论复制到答案中以便我接受吗?

标签: r apply


【解决方案1】:

通常,我们可以通过使用 lapply 替换您的 for 循环来解决此问题。

gene = lapply(gene, function(sl) t(apply(sl, 1, invnorm)))

但是,这个包使用 S4 类,这意味着通常的 lapply 不起作用。好消息是你的 for 循环应该和使用 lapply 一样快。另外,使用 for 循环并没有什么可耻的——apply 语句主要只是为了提高可读性的语法糖。

另见:

Is R's apply family more than syntactic sugar?

【讨论】:

  • 太棒了!并且对 apply 系列和 for 循环都有很好的评价。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多