Итак, я хочу применить функцию по матрице в R. Это действительно работает интуитивно для простых функций:
> (function(x)x*x)(matrix(1:10, nrow=2))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 9 25 49 81
[2,] 4 16 36 64 100
... но ясно, что я не понимаю все его работы:
> m = (matrix(1:10, nrow=2))
> (function(x) if (x %% 3 == 0) { return(NA) } else { return(x+1) })(m)
[,1] [,2] [,3] [,4] [,5]
[1,] 2 4 6 8 10
[2,] 3 5 7 9 11
Warning message:
In if (x == 3) { :
the condition has length > 1 and only the first element will be used
Я прочитал об этом и узнал об Vectorize и sapply, которые оба казались отличными и похожими на то, что я хотел, за исключением того, что оба они преобразуют мою матрицу в список:
> y = (function(x) if (x %% 3 == 0) { return(NA) } else { return(x+1) })
> sapply(m, y)
[1] 2 3 NA 5 6 NA 8 9 NA 11
> Vectorize(y)(m)
[1] 2 3 NA 5 6 NA 8 9 NA 11
... в то время как я хотел бы сохранить его в матрице с текущими размерами. Как я могу это сделать? Спасибо!