【问题标题】:R - Loop in matrixR - 矩阵中的循环
【发布时间】:2012-02-21 20:49:58
【问题描述】:

我有两个变量,第一个是包含 230 个数据的一维流向量,第二个是二维温度矩阵 (230*44219)。

我试图找到每个流量值和对应的 44219 温度之间的相关矩阵。这是我下面的代码。

Houlgrave_flow_1981_2000 = window(Houlgrave_flow_average, start = as.Date("1981-11-15"),end = as.Date("2000-12-15")) 

> str(Houlgrave_flow_1981_2000)
‘zoo’ series from 1981-11-15 to 2000-12-15
Data: num [1:230] 0.085689 0.021437 0.000705 0 0.006969 ...
Index:  Date[1:230], format: "1981-11-15" "1981-12-15" "1982-01-15" "1982-02-15" ...

Hulgrave_SST_1981_2000=X_sst[1:230,]

> str(Hulgrave_SST_1981_2000)
num [1:230, 1:44219] -0.0733 0.432 0.2783 -0.1989 0.1028 ...

sf_Houlgrave_SF_SST = NULL
sst_Houlgrave_SF_SST = NULL
cor_Houlgrave_SF_SST = NULL
for (i in 1:230) {
     for(j in 1:44219){
          sf_Houlgrave_SF_SST[i] =  Houlgrave_flow_1981_2000[i]
          sst_Houlgrave_SF_SST[i,j] = Hulgrave_SST_1981_2000[i,j]
          cor_Houlgrave_SF_SST[i,j] = cor(sf_Houlgrave_SF_SST[i],Hulgrave_SST_1981_2000[i,j]) 
     }
}

错误信息总是说:

Error in sst_Houlgrave_SF_SST[i, j] = Hulgrave_SST_1981_2000[i, j] : 
  incorrect number of subscripts on matrix

感谢您的帮助。

【问题讨论】:

    标签: arrays r loops matrix zoo


    【解决方案1】:

    试试这个:

    # prepare empty matrix of correct size
    cor_Houlgrave_SF_SST <- matrix(nrow=dim(Hulgrave_SST_1981_2000)[1],
                                  ncol=dim(Hulgrave_SST_1981_2000)[2])
    
    # Good practice to not specify "230" or "44219" directly, instead
    for (i in 1:dim(Hulgrave_SST_1981_2000)[1]) {
      for(j in 1:dim(Hulgrave_SST_1981_2000)[2]){
         cor_Houlgrave_SF_SST[i,j] <- cor(sf_Houlgrave_SF_SST[i],Hulgrave_SST_1981_2000[i,j]) 
       }
    }
    

    我相信循环中的两个重新定义是多余的。您的代码的主要问题是没有定义矩阵 - 即 cor 变量没有二维,因此错误。 显然,通过提前明确地为结果提供正确的维度来为 for 循环中的结果定义空矩阵也是一种好习惯 - 旨在使代码更高效。

    【讨论】:

    • 不使用: 运算符也是一个好习惯:考虑如果传入一个零行或零列的矩阵会发生什么。相反,请使用 seq_len(nrow(*))seq_len(ncol(*))
    • 感谢您的帮助。代码仍在加载 3 分钟,我希望有任何问题。