Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
强制“table”包含R中两个数组的所有因子_R_Machine Learning - Fatal编程技术网

强制“table”包含R中两个数组的所有因子

强制“table”包含R中两个数组的所有因子,r,machine-learning,R,Machine Learning,我使用下面的R代码生成混淆矩阵,将某些数据的真实标签与神经网络的输出进行比较 t <- table(as.factor(test.labels), as.factor(nnetpredict)) 您可以在上表中看到,有7行,但有10列,因为a因子只有7个级别,而b因子有10个级别。我想做的是用零填充表格,这样行标签和列标签是相同的,矩阵是正方形的。根据上述示例,这将产生: 1 2 3 4 5 6 7 8 9 10 1 1 0 0 0 0 0 0 1 0 0 2 0

我使用下面的R代码生成混淆矩阵,将某些数据的真实标签与神经网络的输出进行比较

t <- table(as.factor(test.labels), as.factor(nnetpredict))
您可以在上表中看到,有7行,但有10列,因为
a
因子只有7个级别,而
b
因子有10个级别。我想做的是用零填充表格,这样行标签和列标签是相同的,矩阵是正方形的。根据上述示例,这将产生:

    1 2 3 4 5 6 7 8 9 10
  1  1 0 0 0 0 0 0 1 0  0
  2  0 1 0 0 0 0 0 0 1  0
  3  0 0 1 0 0 0 0 0 0  1
  4  0 0 0 1 0 0 0 0 0  0
  5  0 0 0 0 1 0 0 0 0  0
  6  0 0 0 0 0 1 0 0 0  0
  7  0 0 0 0 0 0 1 0 0  0
  8  0 0 0 0 0 0 0 0 0  0
  9  0 0 0 0 0 0 0 0 0  0
  10 0 0 0 0 0 0 0 0 0  0
我需要这样做的原因有两个:

  • 用于显示给用户/在报告中
  • 因此,我可以使用一个函数来计算Kappa统计量,它需要一个如下格式的表(正方形、相同的行和列标签)

编辑-第二轮,以解决问题中的其他细节。我删除了我的第一个答案,因为它不再相关。

这已经为我给出的测试用例生成了所需的输出,但我绝对建议使用真实数据进行彻底的测试。这里的方法是找到表中两个输入的完整级别列表,并在生成表之前将该完整列表设置为级别

squareTable <- function(x,y) {
    x <- factor(x)
    y <- factor(y)

    commonLevels <- sort(unique(c(levels(x), levels(y))))

    x <- factor(x, levels = commonLevels)
    y <- factor(y, levels = commonLevels)

    table(x,y)

}
平方表平方表(y,x)
Y
x123456789
0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0
3 2 1 1 0 4 2 1 3 0 2
4 1 0 0 3 4 2 2 3 4 1
5 3 2 3 6 3 0 3 3 1 0
6 1 3 4 3 2 1 2 4 2 0
7 0 0 3 2 1 0 3 2 4 3
8 0 0 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 0 0
> 
>#测试用例2
>种子(1)
>xx yy
>表(xx,yy)
yy
xx 3 4 5
0  4 14  9
1 14 15  9
2 11 11 13
>平方表(xx,yy)
Y
x123445
0  0  0  0  4 14  9
1  0  0  0 14 15  9
2  0  0  0 11 11 13
3  0  0  0  0  0  0
4  0  0  0  0  0  0
5  0  0  0  0  0  0
>平方表(yy,xx)
Y
x123445
0  0  0  0  0  0  0
1  0  0  0  0  0  0
2  0  0  0  0  0  0
3  4 14 11  0  0  0
4 14 15 11  0  0  0
5  9  9 13  0  0  0

不要命名对象
t
以保留转置(
t()
)函数的功能。谢谢-我没有意识到!明白了-我明白你现在需要做什么了,这比我原来想的要复杂一点。我过一会儿再考虑这个问题。你总是有重叠级别的因素吗?因子的顺序是否总是相同的?谢谢-太好了。在这种情况下,我将有一个因子,其中始终包含数字0-9,另一个因子将始终是该因子的某个子集(大多数情况下,它也将是完整的0-9,但当它不是时,我需要对其进行排序)。它们应该总是按升序排列,至少table命令似乎是这样做的。@robintw-更新的答案,我想我们现在应该走对了。让我知道-汉克斯-那看起来正是我想要的。唯一的问题是,有时我会在terror:non-conformable array。我不知道为什么会发生这种情况——发生这种情况时,我看不到数据中有任何不同!有什么想法吗?@robintw-这很奇怪-这个错误通常意味着你正在尝试执行乘法或无法乘法的矩阵,等等…这在这里不是非常直观。听起来它至少在某些时候能起到广告宣传的效果?首先,我将检查
str()
中是否存在有效的测试用例和无效的测试用例,并尝试识别差异。如果可能的话,
dput()。我已经找到了一个工作和非工作的示例,我把它们放在一个要点中:,因为它们对于这里的问题来说有点太长了。@robintw-hmm,这两个示例都在我的机器上运行,没有任何问题。我认为,
as.factor()
位可能是多余的,因为该函数将所有内容都转换为一个factor,但无论哪种方式,代码在我的机器上都可以很好地执行。您是否将此用作更大函数的一部分?错误可能来自其他地方吗?我想知道是否存在范围界定问题。也许关闭R并重新启动一个新的会话?在这里大声思考。。。
squareTable <- function(x,y) {
    x <- factor(x)
    y <- factor(y)

    commonLevels <- sort(unique(c(levels(x), levels(y))))

    x <- factor(x, levels = commonLevels)
    y <- factor(y, levels = commonLevels)

    table(x,y)

}
> #Test case 1
> set.seed(1)
> x <- factor(sample(0:9, 100, TRUE))
> y <- factor(sample(3:7, 100, TRUE))
> 
> table(x,y)
   y
x   3 4 5 6 7
  0 2 1 3 1 0
  1 1 0 2 3 0
  2 1 0 3 4 3
  3 0 3 6 3 2
  4 4 4 3 2 1
  5 2 2 0 1 0
  6 1 2 3 2 3
  7 3 3 3 4 2
  8 0 4 1 2 4
  9 2 1 0 0 3
> squareTable(x,y)
   y
x   0 1 2 3 4 5 6 7 8 9
  0 0 0 0 2 1 3 1 0 0 0
  1 0 0 0 1 0 2 3 0 0 0
  2 0 0 0 1 0 3 4 3 0 0
  3 0 0 0 0 3 6 3 2 0 0
  4 0 0 0 4 4 3 2 1 0 0
  5 0 0 0 2 2 0 1 0 0 0
  6 0 0 0 1 2 3 2 3 0 0
  7 0 0 0 3 3 3 4 2 0 0
  8 0 0 0 0 4 1 2 4 0 0
  9 0 0 0 2 1 0 0 3 0 0
> squareTable(y,x)
   y
x   0 1 2 3 4 5 6 7 8 9
  0 0 0 0 0 0 0 0 0 0 0
  1 0 0 0 0 0 0 0 0 0 0
  2 0 0 0 0 0 0 0 0 0 0
  3 2 1 1 0 4 2 1 3 0 2
  4 1 0 0 3 4 2 2 3 4 1
  5 3 2 3 6 3 0 3 3 1 0
  6 1 3 4 3 2 1 2 4 2 0
  7 0 0 3 2 1 0 3 2 4 3
  8 0 0 0 0 0 0 0 0 0 0
  9 0 0 0 0 0 0 0 0 0 0
> 
> #Test case 2
> set.seed(1)
> xx <- factor(sample(0:2, 100, TRUE))
> yy <- factor(sample(3:5, 100, TRUE))
> 
> table(xx,yy)
   yy
xx   3  4  5
  0  4 14  9
  1 14 15  9
  2 11 11 13
> squareTable(xx,yy)
   y
x    0  1  2  3  4  5
  0  0  0  0  4 14  9
  1  0  0  0 14 15  9
  2  0  0  0 11 11 13
  3  0  0  0  0  0  0
  4  0  0  0  0  0  0
  5  0  0  0  0  0  0
> squareTable(yy,xx)
   y
x    0  1  2  3  4  5
  0  0  0  0  0  0  0
  1  0  0  0  0  0  0
  2  0  0  0  0  0  0
  3  4 14 11  0  0  0
  4 14 15 11  0  0  0
  5  9  9 13  0  0  0