在循环数据框时获取列名

时间:2017-10-18 22:31:37

标签: r for-loop dataframe

我使用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)
         }
     }
}

我正在尝试将输出设为i的列名,n的列名和相关性。相反,我得到每个列名,每个列名和相关性。

我对R和数据框架都很陌生,所以任何提示都会受到赞赏。

1 个答案:

答案 0 :(得分: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 ransposing将其与预期尺寸的感知内联回来。

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

(顺便说一句:不确定它是否是故意的,但如果你只想要&#34;强相关&#34;无论是正面的还是消极的,你应该将它改为:

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