2016-11-10 12 views
1

Ich habe eine Liste von 9 Listen, siehe den folgenden Code, wo ich nur drei Listen , r und t für Pearson, Spearson und Kendall Korrelationen bzw. statt aller 9 Listen. Der aktuelle Pseudo-Code ist die folgende, wo die Testfunktion corrplot(M.cor, ...) ist, unter dem vollständigen Pseudo-CodeWie Loop Teilmenge von Listen in R?

for (i in p.mat.all) { 
... 
} 

Code mit mtcars Testdaten siehe

library("psych") 
library("corrplot") 

M <- mtcars 

M.cor <- cor(M) 

p.mat.all <- psych::corr.test(M.cor, method = c("pearson", "kendall", "spearman"), 
    adjust = "none", ci = F) 

str(p.mat.all) 

str(p.mat.all$r) 

str(p.mat.all$t) 

str(p.mat.all$p) 

Ausgabe über die Liste von 9 Listen

List of 9 
$ r  : num [1:11, 1:11] 1 -0.991 -0.993 -0.956 0.939 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
    .. ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
$ n  : num 11 
$ t  : num [1:11, 1:11] Inf -21.92 -25.4 -9.78 8.22 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
    .. ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
$ p  : num [1:11, 1:11] 0.00 4.04e-09 1.09e-09 4.32e-06 1.78e-05 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
    .. ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
$ se : num [1:11, 1:11] 0 0.0452 0.0391 0.0978 0.1143 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
    .. ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
$ adjust: chr "none" 
$ sym : logi TRUE 
$ ci : NULL 
$ Call : language psych::corr.test(x = M.cor, method = c("pearson", "kendall", "spearman"),  adjust = "none", ci = F) 
- attr(*, "class")= chr [1:2] "psych" "corr.test" 
num [1:11, 1:11] 1 -0.991 -0.993 -0.956 0.939 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
    ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
num [1:11, 1:11] Inf -21.92 -25.4 -9.78 8.22 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
    ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
num [1:11, 1:11] 0.00 4.04e-09 1.09e-09 4.32e-06 1.78e-05 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 
    ..$ : chr [1:11] "mpg" "cyl" "disp" "hp" ... 

Mein Pseudocode über das Schleifen aller drei Korrelationen mit der Testfunktion corrplot , Aber es wird nicht funktionieren, weil sie durch alle neun Listen

for (i in p.mat.all) { 
    p.mat <- i 
    print("p.mat ===========") 
    print(i)  

    alpha <- 0.05 
    corrplot(M.cor, 
      method="color", 
      type="upper", 
      addCoefasPercent = TRUE, 
      tl.col = "black", 
      tl.pos = "td", 
      p.mat = p.mat, sig.level = alpha, insig = "blank", 
      order = "original" 
) 
} 

Erwartete Ausgabe geht: nur Schleife kann t, p und r Listen, so dass sie auf die Testfunktion corrplot

R übergeben werden: 3.3. 1
OS: Debian 8.5

Antwort

4

Oder mit * anwenden Funktion:

lapply(p.mat.all[c("r","p","t")], function(x) { 
    # x takes now first p.mat.all$r, then p.mat.all$p, etc 
    print("p.mat ===========") 
    print(x)  

    alpha <- 0.05 
    corrplot(M.cor, 
      method="color", 
      type="upper", 
      addCoefasPercent = TRUE, 
      tl.col = "black", 
      tl.pos = "td", 
      p.mat = x, sig.level = alpha, insig = "blank", 
      order = "original" 
) 
}) 
+0

Ist das gleichbedeutend mit Davids Antwort? - - Kannst du bitte deinen 'lapply' Ansatz näher erklären? - - Was bringt das? –

+0

Es ergibt das gleiche Ergebnis. Der größte Grund für die Verwendung der Anwendungsfamilie ist die Geschwindigkeit und Code-Effizienz. For-Schleifen neigen dazu, klobig zu sein und eignen sich für einen Codiererfehler. Gilt für ein wenig Zeit, um den Kopf herumzukriegen, ich arbeite immer noch daran, aber nur, weil ich den Fehler gemacht habe, mit for loops zu beginnen! Wenn Sie es mit den folgenden Plots identisch machen wollen, fügen Sie 'par (mfrow = c (2,2))' 'vor dem Antrag hinzu. – Badger

+1

Ja, das ist äquivalent zu @ Davids Antwort, aber in einer kanonischeren Weise. In R neigen wir dazu, for-Schleifen zu vermeiden, indem wir die * apply-Familie von Funktionen verwenden (die immer noch nur für Schleifen sind, aber in einer anderen Syntax). Der Vorteil ist kompakter Code und mögliche Geschwindigkeitssteigerungen. In Ihrem Fall gibt es keinen Geschwindigkeitsvorteil, aber in anderen wird es sein. – emilliman5

1

Mein Vorschlag ist, die Liste vor dem Looping, dh zu filtern,

for (i in p.mat.all[c("t", "p", "r")]) { 
    ... 
} 

Ausgang für r corrplot, t corrplot und p corrplot

enter image description here

+1

Nizza Grafiken, vielen Dank für die Bearbeitung. Die Verarbeitung scheint korrekt zu sein. Was Sie sehen, sind die drei verschiedenen Korrelationen zwischen jeder Variablen. Was genau ist Ihr Ziel, das Sie versuchen zu erreichen? – David

+0

Lässt sich das zu einem Chat bewegen ?! – David

+0

http://chat.stackoverflow.com/rooms/127822/room-for-david-and-masi – David