2016-03-10 2 views
0

У меня есть эта матрица:вызова rollapply для каждого столбца матрицы с использованием применить

> mtrx <- matrix(c(1:30), nrow=10) 
> mtrx 
     [,1] [,2] [,3] 
[1,] 1 11 21 
[2,] 2 12 22 
[3,] 3 13 23 
[4,] 4 14 24 
[5,] 5 15 25 
[6,] 6 16 26 
[7,] 7 17 27 
[8,] 8 18 28 
[9,] 9 19 29 
[10,] 10 20 30 
> is.matrix(mtrx) 
[1] TRUE 

Я могу apply функции (в данном случае mean) к каждому колонку таким образом:

> apply(mtrx, 2, mean) 
[1] 5.5 15.5 25.5 

Я могу также использование rollapply функция для конкретной колонки (в данном случае первая)

> require(zoo) 
> rollapply(mtrx[,1], width = 2, by = 2, FUN = mean, align = "left") 
[1] 1.5 3.5 5.5 7.5 9.5 

Как объединить выше подходы и выполнить rollapply над каждым столбцом матрицы? Я попробовал следующее:

> apply(mtrx, 2, rollapply, width = 2, by = 2, FUN = mean, align = "left") 
Error in mean.default(newX[, i], ...) : 
    'trim' must be numeric of length one 

А также метод, предложенный here:

> apply(mtrx, 2, function(x) rollapply(width = 2, by = 2, FUN = mean, align = "left")) 
Error in index(x) : argument "data" is missing, with no default 

но и дает мне ошибку, которую я не понимаю.

+0

Что касается ошибки, то как 'apply', так и' rollapply' имеют аргумент 'FUN', поэтому вы указываете' FUN' для 'apply' вместо' rollapply' и, следовательно, все аргументы передаются в 'mean' вместо функции' rollapply', поэтому ошибка возникает из 'mean' (' trim' является одним из его аргументов). –

+0

@ G.Grothendieck и @DavidArenburg Хорошо, мне не нужно использовать 'apply', я понимаю. В любом случае, как передать аргументы в 'rollapply' вместо' apply' и как заставить rollapply работать над строками матрицы вместо столбцов (является ли 't()' одним возможным решением)? Я спрашиваю, потому что, если бы знал ответ на мой первоначальный вопрос, я мог бы легко достичь этих двух целей. Спасибо. –

+1

Если вы хотите работать в строке, установите для параметра «MARGIN» значение 1. И в вашем случае вам нужно будет написать анонимную функцию, например «apply (mtrx, 1, function (x) rollapply (x, width = 2, by = 2, FUN = mean, align = "left")) '(похоже на вашу последнюю попытку, вы просто забыли передать' x' в 'rollapply'. Хотя, возможно,' rollapply' предлагает встроенное решение IDK. Лучше прочитать документацию '? Rollapply', как указано. –

ответ

1

Переведено с комментариев.

Не требуется apply. rollapply уже действует на каждом столбце матрицы по умолчанию:

rollapply(mtrx, width = 2, by = 2, FUN = mean, align = "left") 

См ?rollapply

Кроме того, причина, код не работает в том, что FUN=mean в настоящее время рассматривается как функция перешла к apply, а не функции перешел на rollapply.

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