【问题标题】:repeat apply multiple times. Should I use a for loop?重复应用多次。我应该使用 for 循环吗?
【发布时间】:2016-11-16 14:01:53
【问题描述】:

我有五列和 51695 行的大型矩阵 (zs),例如:

str(zs1)
 num [1:51695, 1:5] 1.347 1.189 1.675 1.055 0.224 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:5] "run 1" "run 2" "run 3" "run 4" ...

我想生成一个向量,其中包含 zs 列中每 5 个值的中值。

zs.stouffer1 = apply(zs1, MARGIN = 1, median)

如何在循环中针对 i 个 zs 矩阵执行此操作?

这是我的尝试:

for (i in 1:23) {
  zs.stouffer <- paste("zs.stouffer", i, sep = "")
  value <- apply(zs[i], MARGIN = 1, median)
  assign(zs.stouffer,value)
}

但我明白了:

apply(zs[i], MARGIN = 1, median) 中的错误:dim(X) 必须具有正长度

【问题讨论】:

  • 将矩阵放入列表中,然后使用lapply 遍历列表。类似matList &lt;- mget(ls(pattern="zs")); myMedianList &lt;- lapply(matList, function(i) apply(i, MARGIN = 1, median))
  • 还可以查看matrixStats 包。函数rowMedians 可以让事情变得更简单
  • 如果您想知道为什么错误,zs[i] 是一个索引,如果 i = 1 不是 zs1。如果你愿意,你必须为它做同样的paste(),就像你在你的函数中所做的一样。 paste("zs", i, sep = "").

标签: r loops for-loop apply


【解决方案1】:

您应该使用get(paste0("zs",i)) 而不是zs[i]

for (i in 1:23) {
  zs.stouffer <- paste("zs.stouffer", i, sep = "")
  value <- apply(get(paste0("zs",i)), MARGIN = 1, median)
  assign(zs.stouffer,value)
}

但正如@lmo 在上面的评论中提到的,最好将矩阵组合在列表中并使用lapply

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多