如何使用 for 循环在 r 中执行 Pearson 相关

How to use for loop to perform Pearson correlation in r

提问人:C.YIN 提问时间:11/14/2023 更新时间:11/14/2023 访问量:30

问:

我有一个 673 x 232 的数据集。我想使用 for 循环来执行 Pearson 相关并保存 p 值和估计值。 我的代码是

vec_lipid <- colnames(df3[,9:232])
df4 <- data.frame(vec_lipid)
df4$p.value <- "0"
df4$estimate <- "0"

for (i in length(vec_lipid)) {
  cortest[i] <- cor.test(df3$CSF_Ab42, df3$vec_lipid[i], method = "pearson")
  df4[i,2] <- cortest[i]$p.value
  df4[i,3] <- cortest[i]$estimate
  i = i+1
  }

但是,它不起作用。你能帮忙调整代码吗? 提前非常感谢。

r for-loop Pearson-Correlation 皮尔逊

评论

0赞 Friede 11/14/2023
请提供数据,使用dput(head(df3))

答:

0赞 jkd 11/14/2023 #1

如果我正确理解了您的代码,您只对第 9 到 232 列和第 CSF_Ab42 列之间的相关性感兴趣。然后,您可以使用以下基于 的代码,避免使用循环。sapply

df4 <- sapply(df3[,-1:-8], \(x) {
  ct <- cor.test(df3$CSF_Ab42, x)
  unlist(ct[c("estimate","p.value")])
}) |> t() |> as.data.frame()

df3 行名是 df3 的相应列名,计算了与 CSF_Ab42 的相关性。如果要将其放在列中,只需添加:.df4$lipid <- rownames(df4)

0赞 margusl 11/14/2023 #2

你可以先把这个问题分成更小的部分,确保一切按你的预期工作,然后才把它们组合在一起。例如,该循环只能运行一次,因为返回单个值; 虽然应该行不通;因为要工作,必须首先被创造;通常,您不希望使用类似length(vec_lipid)df3$vec_lipid[i]df3[[vec_lipid[i]]]cortest[i] <- ...cortesti = i+1

以鸢尾花数据集为例,上一个答案的细微变化可能如下所示:

head(iris)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1          5.1         3.5          1.4         0.2  setosa
#> 2          4.9         3.0          1.4         0.2  setosa
#> 3          4.7         3.2          1.3         0.2  setosa
#> 4          4.6         3.1          1.5         0.2  setosa
#> 5          5.0         3.6          1.4         0.2  setosa
#> 6          5.4         3.9          1.7         0.4  setosa

iris[2:4] |>
  lapply(cor.test, iris$Sepal.Length) |>
  do.call(rbind, args = _) |>
  subset(select = c(estimate, p.value))
#>              estimate   p.value     
#> Sepal.Width  -0.1175698 0.1518983   
#> Petal.Length 0.8717538  1.038667e-47
#> Petal.Width  0.8179411  2.325498e-37

创建于 2023-11-14 with reprex v2.0.2