代码逐字逐句的解决方法是:
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, ]
有一些关于困惑当你编写'pcc = cor.test(i,n,method =“pearson”)'时,你将它们视为myData的列,但是当你编写print(colnames(myData)[i] )'和'print(colnames(myData)[n])'你正在对待它们,就像它们是索引一样 – G5W
在循环的第一遍中,'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
@ r2evans你的建议做的伎俩,非常感谢。如果你想写它作为答案,我可以检查它是正确的。 – SourPatchAdult