2017-10-18 44 views
1

使用R来检查CSV文件并检查每列数据与所有其他列的相关性。在循环数据框时获取列名

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

我想让我的输出成为我的列名,n的列名和相关性。相反,我得到每个列名,每个列名和相关性。

我对R和数据框相当新,所以任何提示将不胜感激。

+0

有一些关于困惑当你编写'pcc = cor.test(i,n,method =“pearson”)'时,你将它们视为myData的列,但是当你编写print(colnames(myData)[i] )'和'print(colnames(myData)[n])'你正在对待它们,就像它们是索引一样 – G5W

+0

在循环的第一遍中,'i'被指定为data.frame的第一列作为完整向量。所以是'n';所以你的第一个'cor.test'调用实际上是'cor.test(myData [,1],myData [,1],method =“pearson”)'。这对你的'pcc'值应该没问题。但是,colnames(myData)[i]'没有意义,因为它不会检索列名向量中的“第n个”名称。也许'对于(我在seq_along(myData))'(与'n'相同)和'cor.test(myData [,i],myData [,n],...)'会更好? – r2evans

+0

@ r2evans你的建议做的伎俩,非常感谢。如果你想写它作为答案,我可以检查它是正确的。 – SourPatchAdult

回答

1

代码逐字逐句的解决方法是:

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

但你不保存任何的这个,而不是仅仅将它打印到控制台。另一种方法:

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

现在这是列名的完整的成对列表:

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

的大部分工作。不幸的是,当一个向量被返回时,使用sapply这个常常令人困惑的事情是,它需要t转义才能将其与预期维度相结合。

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) 

这个存储所有东西,你不需要从长远来看,但你可以轻松地回去看看一切。

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 

从这里,你可以过滤和输出。

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:不知道这是否是故意的,但如果你只是想“强关系”无论是正面或负,您应将其更改为:

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