【问题标题】:Getting column names while looping through a data frame在遍历数据框时获取列名
【发布时间】:2017-10-19 07:24:01
【问题描述】:

我正在使用 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 和数据框架还很陌生,所以任何提示都将不胜感激。

【问题讨论】:

  • 关于 i 和 n 是什么有些混淆。当您编写 pcc = cor.test(i, n, method="pearson") 时,您将它们视为 myData 的列,但是当您编写 print(colnames(myData)[i])print(colnames(myData)[n]) 时,您将它们视为索引
  • 在循环的第一遍中,i 被分配为 data.frame 的第一列作为完整向量; n 也是如此;所以你的第一个cor.test 电话实际上是cor.test(myData[,1], myData[,1], method="pearson")。这对于您的 pcc 值应该没问题。但是,colnames(myData)[i] 没有意义,因为它没有检索列名向量中的“第 n 个”名称。也许for (i in seq_along(myData))n 相同)和cor.test(myData[,i], myData[,n], ...) 会更好?
  • @r2evans 你的建议成功了,非常感谢。如果你想把它写成答案,我可以检查它是否正确。

标签: r for-loop dataframe


【解决方案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 经常令人困惑的是,它需要 transposing 将其放回与预期尺寸的感知一致。

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

(顺便说一句:不确定是否是故意的,但如果你只想要“强相关”无论是正还是负,你应该把它改成:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多