2017-10-18 6 views
1

Ich verwende R, um eine CSV-Datei durchzugehen und die Korrelation der einzelnen Datenspalten mit allen anderen zu überprüfen.Abrufen von Spaltennamen beim Durchlaufen eines Datenrahmens

for(i in myData){ 
    for(n in myData){ 
     pcc = cor.test(i, n, method="pearson") 
     corr <- pcc$estimate 
     pval <- pcc$p.value 
     if(corr > .45 && pval < .05){ 
      print(colnames(myData)[i]) 
      print(colnames(myData)[n]) 
      print (corr) 
     } 
    } 
} 

Ich versuche, meine Ausgabe als Spaltenname von i, Spaltenname von n und die Korrelation zu erhalten. Stattdessen erhalte ich jeden Spaltennamen, jeden Spaltennamen und die Korrelation.

Ich bin relativ neu zu R und Datenrahmen, so dass alle Tipps geschätzt werden würden.

+0

Es gibt einige Verwirrung über was ich und n sind Wenn Sie 'pcc = cor.test (i, n, method =" pearson ") schreiben, behandeln Sie sie als Spalten von myData, aber wenn Sie' print schreiben (colnames (myData) [i]) 'und' print (Spaltennamen (myData) [n]) 'Sie behandeln sie wie Indizes – G5W

+0

Im ersten Durchlauf Ihrer Schleifen wird' i' die erste Spalte des data.frames als vollständiger Vektor zugewiesen; damit ist "n"; Also ist Ihr erster 'cor.test' Aufruf effektiv 'cor.test (myData [, 1], myData [, 1], method =" pearson ")'. Dies sollte für Ihren 'pcc'-Wert in Ordnung sein. "Colnames (myData) [i]" ist jedoch nicht sinnvoll, da der Name "nth" nicht im Vektor der Spaltennamen abgerufen wird. Vielleicht wäre 'für (i in seq_along (myData))' (gleich für 'n') und' cor.test (myData [, i], myData [, n], ...) 'besser? – r2evans

+0

@ r2evans Ihr Ratschlag hat den Trick, sehr geschätzt. Wenn Sie es als Antwort schreiben möchten, kann ich es als das Richtige überprüfen. – SourPatchAdult

Antwort

1

ein ausführlicher Sitzungs fix des Codes ist:

for (i in seq_along(myData)){ 
    for(n in seq_along(myData)){ 
     pcc = cor.test(myData[,i], myData[,n], method="pearson") 
     corr <- pcc$estimate 
     pval <- pcc$p.value 
     if(corr > .45 && pval < .05){ 
      print(colnames(myData)[i]) 
      print(colnames(myData)[n]) 
      print (corr) 
     } 
    } 
} 

Aber Sie werden nichts davon zu speichern, anstatt den Druck es nur an die Konsole. Ein alternativer Ansatz:

myData <- mtcars # since I don't have your data 

eg <- expand.grid(c1 = colnames(myData), c2 = colnames(myData), stringsAsFactors = FALSE) 
eg <- eg[with(eg, c1 != c2),] 

Dies ist nun eine vollständige paarweise Liste der Spaltennamen:

head(eg) 
#  c1 c2 
# 2 cyl mpg 
# 3 disp mpg 
# 4 hp mpg 
# 5 drat mpg 
# 6 wt mpg 
# 7 qsec mpg 

Der Großteil der Arbeit. Leider ist eine oft verwirrende Sache über die Verwendung von sapply, wenn ein Vektor zurückgegeben wird, dass es t ranposing erfordert, um es inline mit der Wahrnehmung der erwarteten Dimensionen zurückzulegen.

Dies speichert alles, was Sie auf lange Sicht nicht brauchen, aber Sie können einfach zurück gehen und alles sehen.

head(out) 
#  c1 c2 estimate  p.value 
# 2 cyl mpg -0.8521620 6.112687e-10 
# 3 disp mpg -0.8475514 9.380327e-10 
# 4 hp mpg -0.7761684 1.787835e-07 
# 5 drat mpg 0.6811719 1.776240e-05 
# 6 wt mpg -0.8676594 1.293959e-10 
# 7 qsec mpg 0.4186840 1.708199e-02 

Von hier aus können Sie filtern und ausgeben.

head(out[ out$estimate > 0.45 & out$p.value < 0.05, ]) 
#  c1 c2 estimate  p.value 
# 5 drat mpg 0.6811719 1.776240e-05 
# 8 vs mpg 0.6640389 3.415937e-05 
# 9 am mpg 0.5998324 2.850207e-04 
# 10 gear mpg 0.4802848 5.400948e-03 
# 14 disp cyl 0.9020329 1.802838e-12 
# 15 hp cyl 0.8324475 3.477861e-09 

(BTW: nicht sicher, ob es beabsichtigt ist, aber wenn man nur „starke Korrelation“ wollen, ob positive oder negative, sollten Sie es ändern:

out[ abs(out$estimate) > 0.45 & out$p.value < 0.05, ] 
Verwandte Themen