我对R有非常基本的疑问 我有一张这样的桌子:
A B C D E
7 1 6 8 7
9 3 9 5 9
4 6 2 1 10
10 5 3 4 1
1 3 5 9 3
6 4 8 7 6
我正在寻找每个变量与表中每个其他变量的相关性。最终报告应该是这样的:
Var_1 Var_2 Correlation
A A 1
A B -0.022991544
A C 0.231553
A D -0.28037
A E -0.00523
B A -0.022999
B B 1
…
…
E D -0.39223
E E 1
以下是我用来实现此目的的R代码:
rm(list=ls())
test <- read.csv("D:/AB/test.csv")
iterations <- ncol(test)
correlation <- matrix(ncol = 3 , nrow = iterations)
for (k in 1:iterations) {
for (l in 1:iterations){
corr <- cor(test[,k], test[,l])
corr_string_A <- names(test[k])
corr_string_B <- names(test[l])
correlation[l,] <- rbind(corr_string_A, corr_string_B, corr)
}
}
但我最终只获得了E变量的输出:
> correlation
[,1] [,2] [,3]
[1,] "E" "A" "-0.0523026032815805"
[2,] "E" "B" "0"
[3,] "E" "C" "0.231900361745681"
[4,] "E" "D" "-0.392232270276368"
[5,] "E" "E" "1"
据我所知,上述代码中使用的双For循环中的某个地方存在循环问题,因此只有&#34; E&#34;系列印刷。我无法理解。
如果有人能帮助我,那真的很棒。
修改*
稍微改变输入数据
A B C D E
0 0 6 8 7
0 0 9 5 9
0 0 2 1 10
0 0 3 4 1
0 0 5 9 3
0 0 8 7 6
如果其中一列为0,我们将得到的相关值为“NaN&#39;”。我想处理NaN&#39;,根据业务规范替换其他一些值。对不起加入。谢谢你的理解。
答案 0 :(得分:1)
Hmisc包有一个rcorr函数,它将返回一个列表,其第一项是相关矩阵。它需要一个矩阵作为输入,函数data.matrix旨在提供。转换为三列格式由as.data.frame.table函数完成:
library(Hmisc)
as.data.frame.table( rcorr(data.matrix(dat))[[1]] )
#-------
Var1 Var2 Freq
1 A A 1.00000000
2 B A -0.02299154
3 C A 0.23155349
4 D A -0.28036851
5 E A -0.05230260
6 A B -0.02299154
7 B B 1.00000000
8 C B -0.58384037
9 D B -0.80175394
10 E B 0.00000000
11 A C 0.23155349
12 B C -0.58384037
13 C C 1.00000000
14 D C 0.52094591
15 E C 0.23190036
16 A D -0.28036851
17 B D -0.80175394
18 C D 0.52094591
19 D D 1.00000000
20 E D -0.39223227
21 A E -0.05230260
22 B E 0.00000000
23 C E 0.23190036
24 D E -0.39223227
25 E E 1.00000000
names<-
函数可用于根据您的规范修饰列名。
答案 1 :(得分:1)
要在不改变代码的情况下回答您的问题,有两个主要问题。首先,您没有分配正确大小的矩阵。在这个例子中,有五个变量有5个变量,或者25个组合(一些组合加倍,即A / C = C / A),所以你需要修改你的矩阵声明来解释:
correlation <- matrix(ncol = 3 , nrow = iterations * iterations)
其次,您只是在嵌套for循环中为此矩阵的前五列赋值。这一行:
correlation[l,] <- rbind(corr_string_A, corr_string_B, corr)
第一次通过嵌套循环后,需要的值大于l
(在示例中只能达到5),如下所示:
correlation[l + ((k-1) * iterations),] <- rbind(corr_string_A, corr_string_B, corr)
此代码应解决这些问题:
iterations <- ncol(test)
correlation <- matrix(ncol = 3 , nrow = iterations * iterations)
for (k in 1:iterations) {
for (l in 1:iterations){
corr <- cor(test[,k], test[,l])
corr_string_A <- names(test[k])
corr_string_B <- names(test[l])
correlation[l + ((k-1) * iterations),] <- rbind(corr_string_A, corr_string_B, corr)
}
}