2015-08-06 2 views
1

Я хотел бы сделать следующее, учитывая матрицу, например: mat <- matrix(1:100, nrow = 4) и набор комбинаций столбцов c_w <- combn(c(1,2,3,4), 2). Я хотел бы рассчитать среднее значение для каждой комбинации. Итак, для первой комбинации мы имеем rowMeans(mat[,c_w[,1]]), для второго rowMeans(mat[,c_w[,2]]). Пока что так хорошо, и я могу обернуть это в цикл for, а затем использовать комбинацию строк, чтобы объединить результаты в красивой матрице результатов. Однако проблема в производительности, если это возможно, я хотел бы сделать это в векторном виде. Так что я задал себе вопрос:Вычислить среднее значение для каждой строки в наборе столбцов

можем ли мы сделать это без использования петель в R-коде?

Редактировать Я хотел бы иметь его в форме матрицы, где каждый столбец обозначает среднее значение для каждого набора. Однако это также может быть достигнуто с некоторыми небольшими дополнениями к коду Аруна. Пожалуйста, переведите комментарий в ответ, чтобы я дал вам очки :).

Благодаря

+1

подход массив является кстати немного быстрее, я думаю. – Snowflake

ответ

2

Мы можем использовать FUN аргумент в combn сделать rowMeans непосредственно в combn шаг после того, как Подменю столбцы «мата» с индексом столбца, полученного из combn

combn(1:4, 2, FUN=function(x) rowMeans(mat[,x])) 
# [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] 3 5 7 7 9 11 
#[2,] 4 6 8 8 10 12 
#[3,] 5 7 9 9 11 13 
#[4,] 6 8 10 10 12 14 

Или другой если мы получили вывод combn, то он должен был бы splitcol из 'c_w' и прокрутить элементы «списка» с помощью sapply, подмножество «мат» с числовым индекс и получить rowMeans

sapply(split(c_w, col(c_w)), function(x) rowMeans(mat[,x])) 
#  1 2 3 4 5 6 
#[1,] 3 5 7 7 9 11 
#[2,] 4 6 8 8 10 12 
#[3,] 5 7 9 9 11 13 
#[4,] 6 8 10 10 12 14 

Или третий подход будет СЦЕПИТЬ (c), индекс столбца из c_w и использовать, чтобы получить столбцы «мата», создать array с заданными размерами. Здесь мы знаем, что 4 - это число строк «mat», 2 как «m», указанное в combn и 6 как ncol «c_w». Loop с apply, укажите MARGIN как '3' и получите rowMeans.

apply(array(mat[,c(c_w)], c(4,2,6)), 3, rowMeans) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] 3 5 7 7 9 11 
#[2,] 4 6 8 8 10 12 
#[3,] 5 7 9 9 11 13 
#[4,] 6 8 10 10 12 14 

Или, как @ A.Webb упоминалось, apply будет более естественным для матрицы как c_w

apply(c_w,2,function(i) rowMeans(mat[,i])) 
+1

'apply (c_w, 2, function (i) rowMeans (mat [, i]))' для меня немного понятнее. –

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