2016-11-16 75 views
-1

我有大矩阵(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)必须为正长度

+4

将矩阵放入列表中,然后使用'lapply'来遍历列表。像'matList < - mget(ls(pattern =“zs”)); myMedianList < - lapply(matList,function(i)apply(i,MARGIN = 1,median))'。 – lmo

+1

也可以看看'matrixStats'包。函数'rowMedians'可以让事情变得更容易 – Sotos

+0

如果你想知道为什么错误'zs [i]'是一个索引,如果'i = 1'则不是'zs1'。如果你愿意,你必须像你在函数中那样为它执行'paste()'。 'paste(“zs”,i,sep =“”)'。 –

回答

2

您应该使用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