双重循环重新分类矩阵以填补另一个不工作

时间:2013-10-02 10:15:49

标签: arrays r loops matrix

我在工作流程中遇到了一些问题,因为我正在尝试制作一个双循环来填充矩阵工作。在我的脚本开始时我定义:

Tijd_SAT_i <- c("08", "09", "10", "11", "12", "13", "14") 
D <- c(0, 0.01, 0.02, 0.03, 0.04, 0.05)
POD <- matrix(1:(length(Tijd_SAT_i)*length(D)), c(length(Tijd_SAT_i), length(D)))
FAR <- matrix(1:(length(Tijd_SAT_i)*length(D)), c(length(Tijd_SAT_i), length(D)))

之后加载一些东西以创建“BASE”(86乘42乘7阵列)和“SAT”(86乘42乘7阵列)。 BASE和SAT都包含0到22之间的值作为双精度并且具有NA值(NA值构成荷兰的轮廓以及除此之外的所有内容)。 接下来,我需要填充两个矩阵POD(检测概率)和FAR(误报率​​)每小时(Tijd_SAT_i)我想计算6个不同的阈值及其对POD和FAR的影响。稍后我会将这些值放入数据框中,然后使用RGL绘制它们。我编写的用于填写POD和FAR的代码是:

for (k in 1:(length(Tijd_SAT_i))) {
  for (l in 1:(length(D))) {
    pre_C_BASE <- BASE[,,k]
    pre_C_SAT <- SAT[,,k]
    pre_C_BASE[pre_C_BASE >= D[l]] <- 1
    pre_C_BASE[pre_C_BASE < D[l]] <- 0
    pre_C_SAT[pre_C_SAT >= D[l]] <- 1
    pre_C_SAT[pre_C_SAT < D[l]] <- 0
    C_SAT <- as.vector(SAT)
    C_BASE <- as.vector(BASE)
    C_table <- (with(warpbreaks, table(C_SAT, C_BASE)))      
    print(C_table)
    print(dim(C_table))
    #p <- C_table[1, 1]/(C_table[1, 1]+C_table[2, 1])
    #f <- C_table[1, 2]/(C_table[1, 1]+C_table[1, 2])
    #POD[k, l] <- p
    #FAR[k, l] <- f
  }
}

但是由于某些模糊的原因,C_table并不是2乘2矩阵,而是1237乘3351。因此#s后面的东西不能执行。我在哪里出错?

编辑:我发现2×2矩阵的原因没有显示:错误的引用SAT应该是pre_C_SAT。 现在我的应急矩阵(全部42个)。现在的问题是,如果我用#s运行该位,我会得到一个“下标越界”错误。那是为什么?

编辑:我认为麻烦在于'表'并不总是输出2乘2矩阵。

编辑:Pffffrwt。我修好了它。在table命令中有一个令人难以置信的令人讨厌的麻烦,因为当其中一个输入向量中没有零时,它不会返回2乘2的矩阵。我通过将1,0,0,1和1,0,1,0附加到后续向量来修复它,强制创建所有4个值,然后从后续等式中减去1。

2 个答案:

答案 0 :(得分:0)

在循环的每次迭代中,您定义

C_SAT <- as.vector(SAT)
C_BASE <- as.vector(BASE)

所以C_SATC_BASE将始终是长度等于SATBASE维度的乘积的向量。

然后定义

C_table <- (with(warpbreaks, table(C_SAT, C_BASE)))

warpbreaks数据框与您的分析有什么关系?你有没有从某个地方复制并粘贴过这个?它对结果没有影响。

无论如何,table(C_SAT, C_BASE)的行数与C_SAT中唯一值的数量相同,列数与C_BASE中唯一值的数量相同。

答案 1 :(得分:0)

我通过在后续向量中附加1,0,0,1和1,0,1,0来解决问题,强制创建所有4个值,然后从后续等式中减去1。