2015-04-23 7 views
3

Я хочу рассчитать среднее значение смежных значений в каждом столбце (или строке) матрицы (например, среднее значение из [1,1] и [2,1], [2,1 ] и [3,1], [3,1] и [4,1]) и применить их ко всем столбцам.Использование mapply со средней функцией на матрице

Я попытался использовать функцию mapply (чтобы избежать использования цикла for), чтобы вычислить среднее из первых двух значений в каждом столбце и планировать применять это ко всей матрице по строкам. Однако mapply, который, кажется, работает, если я пытаюсь суммировать значения, но не для средней функции.

См ниже пример:

x <- matrix(c(NA,rnorm(28),NA), nrow=6, ncol=5) 
print(x) 
     [,1]  [,2]  [,3]  [,4]  [,5] 
[1,]   NA -0.6557176 1.7741320 0.3667700 -0.5548408 
[2,] 0.14001643 0.2521062 -0.1295084 -0.4272368 0.7598425 
[3,] 0.32123196 0.5736409 0.8618268 2.1535191 0.4686728 
[4,] 0.06573949 -1.2101965 -0.4308219 -0.2624877 -0.3751350 
[5,] -0.66247996 1.2743463 1.6044236 1.2004990 -0.3283678 
[6,] 1.05005260 1.2264607 3.2347421 -0.8113528   NA 

mapply(sum, x[1,], x[2,]) 
[1]   NA -0.40361136 1.64462358 -0.06046682 0.20500169 
# gives the sum of the input of rows 1 and 2 for each column, as expected 

mapply(mean, x[1,], x[2,]) 
[1]   NA -0.6557176 1.7741320 0.3667700 -0.5548408 
# gives the actual values across row 1 

При использовании средней функции, выход, как представляется, значение первой строки. Я подозреваю, что проблема заключается в индексировании правильных входных значений.

ответ

1

Вы можете использовать:

library(zoo) 
apply(x, 2, function(x) rollapply(x, 2, mean)) 
0

Я думаю, что это будет делать то, что вы хотите:

(head(x, -1L) + tail(x, -1L))/2 

Производит (с использованием данных с set.seed(1)):

  [,1]  [,2]  [,3]  [,4]  [,5] 
[2,]   NA -0.1665197 -0.11569867 0.8825287 -0.6847630 
[3,] -0.2214052 0.6128769 -1.41797023 0.7075613 0.2818485 
[4,] -0.3259926 0.6570530 -0.54488448 0.7564393 -0.1059621 
[5,] 0.3798261 0.1351965 0.53999865 0.8505568 -0.8132739 
[6,] 0.9623943 0.6031964 -0.03056194 0.4283506   NA 

tail(x, -1L) дает матрицу с каждой строки, кроме первой. Таким образом, первая строка результирующей матрицы - это вторая строка оригинала, вторая - третья и т. Д. Затем мы добавляем это в исходную матрицу за вычетом первой строки. Это эквивалентно добавлению второй строки к 1-й, 3-й и 2-й и т. Д. Наконец, мы просто делим на две, что дает нам среднее значение.

Причина ваш подход терпит неудачу, потому что mean только средние его первый аргумент, в отличие от sum который суммирует все свои аргументы:

> args(mean) 
function (x, ...) 
NULL 
> args(sum) 
function (..., na.rm = FALSE) 
NULL  

sum суммы всех ..., но mean занимает только среднее x, так вторая строка, которую вы переходите на mean с mapply, отбрасывается (или, что еще хуже, используется как аргумент trim, см. ?mean).