Применить функцию ко всем столбцам в матрице, используя средства столбцов - PullRequest
0 голосов
/ 03 июля 2018

У меня есть матрица m (состоящая из трех столбцов, каждый из которых состоит из целых чисел и имеет среднее значение 5,10 и 15 соответственно):

m <- round(matrix(data=cbind(rnorm(30, 5), rnorm(30, 10), rnorm(30, 15)), nrow=30, ncol=3), 0)

Теперь я хотел бы иметь матрицу с такими же размерами, что и m, где каждое значение x рассчитывается как x минус среднее значение столбца, в котором найден x. Как это может быть сделано? Я пытался применить различные функции применения (в частности, я смотрел на два вопроса user3640617 и User60 ), но проблема, кажется, в том, что я не могу использовать среднее строки в качестве аргумента в sapply, lapply или vapply ...

Пример: если head(m) равно

     [,1] [,2] [,3]
[1,]    6   11   14
[2,]    6    8   16
[3,]    6   11   15
[4,]    6   10   17
[5,]    5    9   15
[6,]    3   10   15

Я хочу получить

     [,1] [,2] [,3]
[1,]    1    1   -1
[2,]    1   -2    1
[3,]    1    1    0
[4,]    1    0    2
[5,]    0   -1    0
[6,]   -2    0    0

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

вы ищете

scale(m,center=T,scale=F)[,]

другой способ

sweep(m,2,colMeans(m)) 

но не так быстро, как scale

0 голосов
/ 03 июля 2018

Одним из способов является использование apply(m, 2, function(x)(x-mean(x)))

Другой способ - использовать t(t(m)-colMeans(m))

...