重复应用多次。我应该使用for循环吗?
问题描述:
我有大矩阵(ZS)具有五列和51695线,如:重复应用多次。我应该使用for循环吗?
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)
我怎样才能做到这一点在一个循环为我的zs矩阵数量?
这是我的尝试:
for (i in 1:23) {
zs.stouffer <- paste("zs.stouffer", i, sep = "")
value <- apply(zs[i], MARGIN = 1, median)
assign(zs.stouffer,value)
}
,但我得到:
错误申请(ZS [I],MARGIN = 1,中位数):昏暗(X)必须为正长度
答
您应该使用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
。
将矩阵放入列表中,然后使用'lapply'来遍历列表。像'matList lmo
也可以看看'matrixStats'包。函数'rowMedians'可以让事情变得更容易 – Sotos
如果你想知道为什么错误'zs [i]'是一个索引,如果'i = 1'则不是'zs1'。如果你愿意,你必须像你在函数中那样为它执行'paste()'。 'paste(“zs”,i,sep =“”)'。 –