2016-11-16 74 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