2016-09-22 68 views
1

apply()とsweep()を比較するメモを書き、次のような奇妙な違いを発見しました。同じ結果を生成するためには、sweep()にはMARGIN = 1が必要です。applyにはMARGIN = 2が必要です。また、行列を指定する引数はapply()では大文字ですが、sweep()では小文字です。apply()とsweep()in 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 

sweep()は「適用型」関数ではありませんか?これはちょうど別のRの奇妙なものか、私は私の心を失った?

+0

あなたの質問は何ですか?具体的には、ドキュメントを読んだ後にはっきりしないものはありますか? – Roland

+0

質問:2つの密接に関連した関数は、実際に同じ問題に対して異なる構文を持っていますか? –

+0

Rは長年にわたって開発されており、Rコアは既存のコードを壊さないよう細心の注意を払っています。これらの機能はおそらくSの遺産であり、S/S-PLUSとの互換性は初期の大きな問題でした。 – Roland

答えて

2

なお 'FUN' への各呼び出しは、長さのベクトルを返す場合apply

ための 'n' は、次いで、C(N、DIM(X」次元の配列を返す '適用')[マージン])あなたの例では> 1 '

N」が'、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?にこの回答を参照してください。