У меня есть эта матрица:вызова 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
но и дает мне ошибку, которую я не понимаю.
Что касается ошибки, то как 'apply', так и' rollapply' имеют аргумент 'FUN', поэтому вы указываете' FUN' для 'apply' вместо' rollapply' и, следовательно, все аргументы передаются в 'mean' вместо функции' rollapply', поэтому ошибка возникает из 'mean' (' trim' является одним из его аргументов). –
@ G.Grothendieck и @DavidArenburg Хорошо, мне не нужно использовать 'apply', я понимаю. В любом случае, как передать аргументы в 'rollapply' вместо' apply' и как заставить rollapply работать над строками матрицы вместо столбцов (является ли 't()' одним возможным решением)? Я спрашиваю, потому что, если бы знал ответ на мой первоначальный вопрос, я мог бы легко достичь этих двух целей. Спасибо. –
Если вы хотите работать в строке, установите для параметра «MARGIN» значение 1. И в вашем случае вам нужно будет написать анонимную функцию, например «apply (mtrx, 1, function (x) rollapply (x, width = 2, by = 2, FUN = mean, align = "left")) '(похоже на вашу последнюю попытку, вы просто забыли передать' x' в 'rollapply'. Хотя, возможно,' rollapply' предлагает встроенное решение IDK. Лучше прочитать документацию '? Rollapply', как указано. –