2016-07-15 8 views
0

Ich habe einen data.frame dim = (200.500)R auf eine Liste in einer Schleife hinzuzufügen Bedingungen mit

ich eine shaprio.test auf jeder Spalte meiner Datenrahmen tun wollen und zu einer Liste anhängen. Das ist, was ich versuche:

colstoremove <- list(); 
for (i in range(dim(I.df.nocov)[2])) { 
    x <- shapiro.test(I.df.nocov[1:200,i]) 
    colstoremove[[i]] <- x[2] 
    } 

Dies ist jedoch fehlgeschlagen. Einige Hinweise? (Hintergrund ist vor allem Python, nicht viel von einem R-Benutzer)

+0

Warum verwenden Sie Bereich, um Ihren Schleifenindex zu generieren? Verwenden Sie stattdessen 'i in seq_along (I.df.nocov)'. – Alex

Antwort

2

Betrachten lapply() wie jeder Datenrahmen in gebenen Operationen auf Spalten läuft und die zurückgegebene Liste wird auf der Anzahl der Spalten gleich sein:

colstoremove <- lapply(I.df.noconv, function(col) shapiro.test(col)[2]) 
+0

In Situationen wie diesem verwende ich 'function (col) shapiro.test (col) [2]', um zu betonen, dass 'lapply' auf die Spalten des Datenrahmens einwirkt. – Alex

+0

Guter Punkt, @Alex! – Parfait

1

Hier ist das, was

for (i in range(dim(I.df.nocov)[2])) 

aus Gründen des Beispiels in

passiert, gehe ich davon aus, dass I.df.nocov 100 Zeilen und 5 Spalten enthält.

dim(I.df.nocov) der Vektor der I.df.nocov Dimensionen, das heißt c (100, 5)

dim(I.df.nocov)[2] ist der 2. Dimension I.df.nocov, dh 5

range(x) ein Vektor 2-Element ist, das minimale und maximale Werte enthält von x. Zum Beispiel ist der Bereich (c (4,10,1)) c (1,10). Also range(dim(I.df.nocov)[2]) ist c (5,5).

Daher iteriert die Schleife zweimal: das erste Mal mit i = 5, und das zweite Mal auch mit i = 5. Nicht überraschend, dass es fehlschlägt!

Das Problem ist, dass R-Funktion range und Python-Funktion mit dem gleichen Namen ganz andere Dinge tun. Das Äquivalent von Pythons range heißt seq. Zum Beispiel seq(5)=c(1,2,3,4,5), während seq(3,5)=c(3,4,5) und seq(1,10,2)=c(1,3,5,7,9). Sie können auch schreiben 1:n, es ist die gleiche wie seq(n) ist, und m:n ist die gleiche wie seq(m,n) (aber die Priorität ‚:‘ ist sehr hoch, so 1:2*x als (1:2)*x interpretiert

Im Allgemeinen, wenn etwas nicht in funktioniert. R, Sie sollten die Teilausdrücke von innerwise nach outwardwise drucken.Wenn ein Teilausdruck zu groß ist, um gedruckt zu werden, verwenden Sie str (x) (str bedeutet "Struktur"). Und nehmen Sie nie an, dass Funktionen in Python und R gleich sind! Es gibt eine Funktion mit dem gleichen Namen, es macht normalerweise eine andere Sache.

Auf eine Randnotiz, anstelle von dim(I.df.nocov)[2] könnten Sie einfach ncol(I.df.nocov) schreiben (es gibt auch eine Funktion nrow).

Verwandte Themen