提问人:C.YIN 提问时间:11/14/2023 更新时间:11/14/2023 访问量:30
如何使用 for 循环在 r 中执行 Pearson 相关
How to use for loop to perform Pearson correlation in r
问:
我有一个 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
}
但是,它不起作用。你能帮忙调整代码吗? 提前非常感谢。
答:
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] <- ...
cortest
i = 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
评论
dput(head(df3))