带因子数据的循环

时间:2019-03-11 21:38:27

标签: 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个不同的因素,并且输出将是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

2 个答案:

答案 0 :(得分:2)

t(sapply(split(predicted == observed, observed), table))
#  FALSE TRUE
#a     2    1
#b     1    1
#c     1    1

答案 1 :(得分:0)

我建议您使用data.table作为明确的清晰方法来定义结果:

library(data.table)
observed=c("a", "b", "c", "a", "b", "c", "a")
predicted=c("a", "a", "b", "b", "b", "c", "c")

dt <- data.table(observed, predicted)

res <- dt[, .(
  T = sum(observed == predicted), 
  F = sum(observed != predicted)), 
  observed
]

res
#   observed T F
# 1:        a 1 2
# 2:        b 1 1
# 3:        c 1 1