2016-11-16 2 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" ... 

Я хотел бы генерировать вектор, содержащий средние значения для каждого из 5 значений в столбце Zs.

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) 
} 

Но я получаю:

Ошибка применить (ZS [я], MARGIN = 1, медиана): тусклый (X) должна иметь положительный длина

+4

Поместите матрицы в список, а затем используйте 'lapply' для запуска списка. Что-то вроде 'matList <- mget (ls (pattern =" zs ")); myMedianList <- lapply (matList, функция (i) применяется (i, MARGIN = 1, медиана)). – lmo

+1

Также посмотрите на пакет 'matrixStats'. Функция 'rowMedians' может упростить задачу – Sotos

+0

Если вам интересно, почему ошибка,' zs [i] 'является индексированием, это не' zs1', если 'i = 1'. Если вы хотите, вы должны сделать то же самое '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.

 Смежные вопросы

  • Нет связанных вопросов^_^