我使用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和数据框架都很陌生,所以任何提示都会受到赞赏。
答案 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, ]