【发布时间】: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 <- mget(ls(pattern="zs")); myMedianList <- lapply(matList, function(i) apply(i, MARGIN = 1, median))。 -
还可以查看
matrixStats包。函数rowMedians可以让事情变得更简单 -
如果您想知道为什么错误,
zs[i]是一个索引,如果i = 1不是zs1。如果你愿意,你必须为它做同样的paste(),就像你在你的函数中所做的一样。paste("zs", i, sep = "").