R中For循环中下标的用法

时间:2015-12-09 19:44:04

标签: r

我对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;,根据业务规范替换其他一些值。对不起加入。谢谢你的理解。

2 个答案:

答案 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)        
  }
}