2016-05-26 8 views
-1

Dies könnte die dümmste Frage, aber ich scheine nicht die Funktion sapply zu begreifen: Hier ist mein ProblemVerständnis sapply Funktion in r

 Example: 
     d = matrix(1:10, 5,2) 
     d[3] = NA 

#    [,1] [,2] 
     #[1,] 1 6 
     #[2,] 2 7 
     #[3,] NA 8 
     #[4,] 4 9 
     #[5,] 5 10 

Wenn ich die Zeile berechnen möchte, bedeutet sapply Funktion Ich würde etwas wie dieses verwenden:

Sollte es mir nicht das Mittel der Liste der Elemente geben? Es spuckt nur die Elemente meiner Matrix aus und nicht das Mittel.

Wenn ich mich bewerben verwenden, erhalte ich die richtige Antwort:

apply(d,1,mean, na.rm=T) 
    [1] 3.5 4.5 8.0 6.5 7.5 

Kann mir eine sehr Attrappe jemand die Mühe explanation.Highly appreicated geben. Verwenden Sie die folgenden Links, bevor Sie die Frage stellen. link 1Link 2Link 3

+0

Dies könnte nützlich sein: http://stackoverflow.com/questions/27477768/lapplype-works-over-an-array-or-a-single-element/27477951 – thelatemail

Antwort

2

haben Sie gelesen ?sapply. Die Funktion verwendet entweder einen Vektor oder ein Ausdrucksobjekt. Es kann keine Matrix nehmen. Also, was in Ihrem Beispiel passiert, ist, dass die Matrix d als Vektor von numerischen betrachtet wird:

sapply(as.numeric(d),mean) 
1

sapply (und seine Freunde, wie lapply) benötigen eine Liste (oder eine data.frame, das ist wirklich eine besondere ist Art der Liste) als Eingabe. Aber selbst wenn Sie Ihre Matrix in einen Datenrahmen verwandelt hätten, hätte es Ihnen Zeile bedeutet, es hätte Ihnen Spalte bedeutet. Wenn Sie verstehen wollen, wie diese Funktionen funktionieren, kann es hilfreich sein, diese Funktion zu betrachten (kopiert von hier: http://adv-r.had.co.nz/Functionals.html), die die Essenz von lapply mit der Basis R zeigt. (sapply funktioniert in der gleichen Weise, es versucht nur, die zu vereinfachen Ausgang auf einen Vektor, anstatt immer eine Liste zurück.)

lapply2 <- function(x, f, ...) { 
out <- vector("list", length(x)) 
for (i in seq_along(x)) { 
    out[[i]] <- f(x[[i]], ...) 
    } 
    out 
} 

By the way, wenn der Punkt Ihrer Frage ist die beste Art und Weise der Berechnung der Zeile, Mittel zu finden, anstatt sapply zu verstehen, dann gibt es eine Funktion rowMeans das ist der schnellste Weg, es zu tun - schneller als zum Beispiel apply, zum Beispiel.

Verwandte Themen