2013-07-30 29 views
2

一个二维函数I具有一些真正的和预测的标签矢量化中的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中推荐的策略是什么?

我总是可以通过更高阶的东西,但这似乎很笨拙。

回答

3

我有时无法理解outer也出错了。对于这个任务,我会用表功能:

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

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

+0

我会发布更高阶的东西以及。 – nicolas

2

outer假定传递给FUN的函数可以接受向量参数并且可以正确地与它们一起工作。如果mn是传递给外部的两个向量的长度,则它将首先创建两个长度为m*n的向量,以便发生每个输入组合,并将这些向量作为两个新向量传递给FUN。对此,外界期望,FUN将返回另一个长度为m*n

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

的一种方法是定义可以处理向量输入正确,或者,如果你的程序实际上需要一个简单的匹配,你可以使用table()作为@DWin的回答

如果你重新定义另一个函数你的功能,外期待,将用于投入运行的功能:

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

和按您的例子,应该返回,

c(3,1,2,4) 

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

dim(output) = c(m,n) 

这是给出一个错误的行,因为外试图形状,而函数f输出到一个2×2矩阵(总共2×2 = 4项),假定没有矢量化,已只给出1个输出。因此,

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