2016-09-22 4 views
1

Ich schrieb Notizen zu vergleichen apply() und sweep() und entdeckte die folgenden seltsamen Unterschiede. Um das gleiche Ergebnis zu erzeugen, benötigt sweep() MARGIN = 1, während apply will MARGIN = 2. Auch das Argument, das die Matrix angibt, ist Großbuchstaben X in apply(), Kleinbuchstaben in sweep().apply() vs. 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 

Ist nicht Sweep() eine "Anwendungstyp" -Funktion? Ist das nur ein weiterer Fehler oder habe ich meinen Verstand verloren?

+0

Was ist Ihre Frage, d. H. Was genau ist nach dem Lesen der Dokumentation unklar? – Roland

+0

Frage: Haben zwei eng verwandte Funktionen tatsächlich unterschiedliche Syntax für dasselbe Problem? –

+0

Beachten Sie, dass R über eine lange Zeit entwickelt wurde und R-Core sehr darauf achtet, den bestehenden Code nicht zu zerstören. Beide Funktionen sind wahrscheinlich ein Vermächtnis von S und Kompatibilität mit S/S-PLUS war in den frühen Tagen ein großes Problem. – Roland

Antwort

2

beachte, dass für apply,

Wenn jeder Aufruf von 'Spaß' einen Vektor der Länge zurückkehrt 'n' ist, dann Anwenden 'gibt einen Array von Dimension ‚c (n, dim (X) [ MARGIN])‘, wenn 'n> 1'

in Ihrem Beispiel MARGIN kann (und sollte) zu 1 in beiden Fällen nicht eingestellt werden; aber der zurückgegebene Wert von apply sollte transponiert werden. Dies ist am einfachsten zu sehen, ob die ursprüngliche Matrix nicht quadratisch ist:

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 

Auch diese Antwort Can you implement 'sweep' using apply in R? finden, die sehr viel die gleiche Sache sagt.