Для цикла с факторными данными - PullRequest
1 голос
/ 12 марта 2019

У меня есть два вектора факторных данных с одинаковой длиной. Просто для примера:

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 ]

2 голосов
/ 12 марта 2019
t(sapply(split(predicted == observed, observed), table))
#  FALSE TRUE
#a     2    1
#b     1    1
#c     1    1
0 голосов
/ 12 марта 2019

Я бы посоветовал вам использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...