2017-10-18 3 views
1

Im en utilisant R pour parcourir un fichier CSV et vérifier la corrélation de chaque colonne de données par rapport à toutes les autres. J'essaye d'obtenir que ma sortie soit le nom de colonne de i, le nom de colonne de n, et la corrélation. Au lieu de cela, j'obtiens chaque nom de colonne, chaque nom de colonne et la corrélation. Je suis assez nouveau pour R et les trames de données donc tous les conseils seraient appréciés.Obtention de noms de colonne lors de la lecture d'une trame de données

+0

Il y a une certaine confusion au sujet ce que sont i et n Lorsque vous écrivez 'pcc = cor.test (i, n, méthode =" pearson ")' vous les traitez comme des colonnes de myData, mais quand vous écrivez 'print (colnames (myData) [i]) 'et' print (colnames (myData) [n]) 'vous les traitez comme s'ils étaient des index – G5W

+0

Dans le premier passage de vos boucles,' i' se voit attribuer la première colonne du fichier data.frame en tant que vecteur complet; alors est 'n'; donc votre premier appel 'cor.test' est effectivement' cor.test (myData [, 1], myData [, 1], method = "pearson") '. Cela devrait convenir à votre valeur 'pcc'. Cependant, 'colnames (myData) [i]' n'a pas de sens, car il ne récupère pas le nom "nth" dans le vecteur des noms de colonnes. Peut-être que 'for (i dans seq_along (myData))' (même chose pour 'n') et' cor.test (myData [, i], myData [, n], ...) 'serait préférable? – r2evans

+0

@ r2evans votre conseil a fait l'affaire, très apprécié. Si vous voulez l'écrire comme réponse, je peux le vérifier comme le bon. – SourPatchAdult

Répondre

1

Un correctif verbatim de votre code est:

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) 
     } 
    } 
} 

Mais vous n'épargnent pas tout cela, au lieu d'imprimer simplement à la console. Une autre approche:

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),] 

Voici maintenant une liste par paires complète des noms de colonnes:

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

La majorité des travaux. Malheureusement, une chose souvent déroutante à propos de l'utilisation de sapply lorsqu'un vecteur est retourné est qu'il faut t ransposing pour le remettre en ligne avec la perception des dimensions attendues.

res <- t(sapply(seq_len(nrow(eg)), function(i) { 
    pcc <- cor.test(myData[[eg$c1[i]]], myData[[eg$c2[i]]], method = "pearson") 
    c(pcc$estimate, pcc$p.value) 
})) 
colnames(res) <- c("estimate", "p.value") 
out <- cbind(eg, res) 

Ce stocke tout, que vous n'avez pas besoin à long terme, mais vous pouvez facilement revenir en arrière et tout voir.

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 

À partir de là, vous pouvez filtrer et sortir.

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: pas sûr si elle est intentionnelle, mais si vous voulez seulement « forte corrélation » qu'ils soient positifs ou négatif, vous devez changer pour:

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