向量化R中的二维函数

时间:2013-07-30 21:53:00

标签: r

我有一些真实和预测的标签

truth <- factor(c("+","+","-","+","+","-","-","-","-","-"))
pred  <- factor(c("+","+","-","-","+","+","-","-","+","-"))

我想构建混淆矩阵。 我有一个适用于一元元素的函数

f <- function(x,y){ sum(y==pred[truth == x])}

然而,当我将它应用于外部产品时,为了构建矩阵,R似乎不高兴。

outer(levels(truth), levels(truth), f)
Error in outer(levels(x), levels(x), f) : 
  dims [product 4] do not match the length of object [1]

R中推荐的策略是什么?

我总是可以通过更高级别的东西,但这看起来很笨拙。

2 个答案:

答案 0 :(得分:3)

我有时也无法理解outer出错的地方。对于这个任务,我会使用表函数:

> table(truth,pred)   # arguably a lot less clumsy than your effort.
     pred
truth - +
    - 4 2
    + 1 3

在这种情况下,您将测试多值向量是否为标量“==”。

答案 1 :(得分:2)

outer假设传递给FUN的函数可以使用向量参数并与它们一起正常工作。如果mn是传递给外部的两个向量的长度,它将首先创建两个长度为m*n的向量,这样每个输入组合都会发生,并将这两个向量传递给两个向FUN的新向量。对此,外部期望FUN将返回另一个长度为m*n

的向量

您的示例中描述的功能并不是真的这样做。事实上,它根本无法正确处理向量。

一种方法是定义另一个可以正确处理矢量输入的函数,或者,如果你的程序实际上需要一个简单的匹配,你可以在@DWin的答案中使用table()

如果你正在重新定义你的函数,外部期望一个将为输入运行的函数:

f(c("+","+","-","-"), c("+","-","+","-"))

根据你的例子,应该回来,

c(3,1,2,4)

解码错误的实际含义还有一个小问题:
同样,如果mn是传递给外部的两个向量的长度,它将首先创建一个长度为m*n的向量,然后使用(基本上)

dim(output) = c(m,n)

这是给出错误的行,因为外部试图将输出整形为2x2矩阵(总共2 * 2 = 4项),而函数f(假设没有矢量化)仅给出1个输出。因此,

Error in outer(levels(x), levels(x), f) : 
  dims [product 4] do not match the length of object [1]