带因子数据的For循环

带因子数据的For循环,r,R,我有两个相等长度的因子数据向量。举个例子: observed=c("a", "b", "c", "a", "b", "c", "a") predicted=c("a", "a", "b", "b", "b", "c", "c") 最后,我试图生成一个分类矩阵,显示每个因素被正确预测的次数。该示例如下图所示: name T F a 1 2 b 1 1 c 1 1 注意,tables()命令在这里不起作用,因为我有11个不同的因子

我有两个相等长度的因子数据向量。举个例子:

observed=c("a", "b", "c", "a", "b", "c", "a")
predicted=c("a", "a", "b", "b", "b", "c", "c")
最后,我试图生成一个分类矩阵,显示每个因素被正确预测的次数。该示例如下图所示:

  name  T F
     a  1 2
     b  1 1
     c  1 1            
注意,tables()命令在这里不起作用,因为我有11个不同的因子,并且输出将是11x11而不是11x2。我的计划是创建三个向量,并将它们组合成一个数据帧

首先,现有向量中唯一因子值的向量。这很简单,

 names=unique(df$observed)
接下来,一个值向量,显示正确预测的数量。这就是我遇到麻烦的地方。我可以得到单个因素的正确预测数,如下所示:

correct.a=sum(predicted[which(observed == "a")] == "a")
但这是麻烦的重复一次又一次,然后结合成一个向量一样

correct=c("correct.a", "correct.b", correct.c")
有没有一种方法可以使用循环(或者你能想到的其他策略)来改进这个过程

还要注意,我将创建的最终向量如下:

incorrect.a=sum(observed == "a")-correct.a

我建议您使用
data.table
明确定义结果的方式:

库(data.table)
观察值=c(“a”、“b”、“c”、“a”、“b”、“c”、“a”)
预测=c(“a”、“a”、“b”、“b”、“c”、“c”)

一个hashmap/字典不会帮你吗?为每个键(字符)指定一个计数值,比如a=1,b=2,等等?这可能对我给出的具体例子有所帮助,但我使用这些值只是为了方便;我的实际数据是文字。也不确定这将如何使我能够修复显示正确和错误响应的问题。您可以使用文字。这里的想法是在预测中遇到单词时向上计数,然后在观察者中遇到单词时向下计数。因此,predicted=c(“a”、“a”、“b”、“b”、“b”、“c”、“c”)将以一个映射结束,即:a=2,b=3,c=2。然后,我们运行observed=c(“a”、“b”、“c”、“a”、“b”、“c”、“a”);因此,a=-1,b=1,c=0如果单词不存在,请将单词=1添加到地图中。如果单词存在于地图中,获取值,增加1,为单词分配新值,等等。啊,我明白了。但问题是,仅仅因为向量中的预测因子和观察因子(示例中为c)数量相同,并不意味着存在任何正确的预测。预测=c(“a”、“b”、“a”、“b”)和观察=c(“b”、“a”、“b”、“a”)将显示a=0,b=0,但没有正确的预测。有趣的是,我必须熟悉其中的一些命令。这会获取正确预测的数量,但不会垂直显示,也不会显示错误预测(正确预测的数量显示在每个因子下方)。
t(sapply(split(predicted == observed, observed), table))
#  FALSE TRUE
#a     2    1
#b     1    1
#c     1    1