2016-09-22 1 views
1

Я писал заметки для сравнения apply() и sweep() и обнаружил следующие странные отличия. Чтобы сгенерировать тот же результат, sweep() требует MARGIN = 1, тогда как apply требует MARGIN = 2. Также аргумент, определяющий матрицу, имеет верхний регистр X в apply(), но строчный в sweep().apply() vs. sweep() в R

my.matrix <- matrix(seq(1,9,1), nrow=3) 
row.sums <- rowSums(my.matrix) 
apply.matrix <- apply(X = my.matrix, MARGIN = 2, FUN = function (x) x/row.sums) 
sweep.matrix <- sweep(x = my.matrix, MARGIN = 1, STATS = rowSums(my.matrix), FUN="/") 
apply.matrix - sweep.matrix ##yup same matrix 

Не работает функция «наложения типа»? Является ли это еще одним R quirk или я потерял рассудок?

+0

Каков ваш вопрос, то есть что непонятно после прочтения документации? – Roland

+0

Вопрос: существуют ли две тесно связанные функции, действительно, имеют разный синтаксис для одной и той же проблемы? –

+0

Обратите внимание, что R был разработан в течение длительного времени, и R-Core бережно относится к тому, чтобы не нарушить существующий код. Обе эти функции, вероятно, являются наследием S, и совместимость с S/S-PLUS была большой проблемой в первые дни. – Roland

ответ

2

Обратите внимание, что для apply,

Если каждый вызов «ПОТЕХИ» возвращает вектор длины «N», то «применить» возвращает массив размерности «с (п, тусклый (X) [ MARGIN])»если 'п> 1'

в вашем примере, MARGIN может (и должен) быть установлен в 1 в обоих случаях; но возвращаемое значение от apply должно быть перенесено. Легче всего это увидеть, если исходная матрица не квадратная:

my.matrix <- matrix(seq(1,12,1), nrow=4) 
apply.matrix <- t(apply(X = my.matrix, MARGIN = 1, FUN = function(x) x/sum(x))) 
sweep.matrix <- sweep(x = my.matrix, MARGIN = 1, STATS = rowSums(my.matrix), FUN="/") 
all.equal(apply.matrix, sweep.matrix) 
# [1] TRUE 

Также см этот ответ Can you implement 'sweep' using apply in R?, который говорит, что очень то же самое.