Генерируйте проценты используя group_by и mutate - PullRequest
0 голосов
/ 16 мая 2019

Я работаю над набором данных, который содержит прогнозную метку (predicted) и истинную метку (label) для каждого id и столбец, указывающий, равна ли прогнозная метка истинной метке (match). Я хочу показать процент правильного прогноза для каждого label по отношению к общему количеству наблюдений, принадлежащих этому ярлыку.

В качестве примера приведены следующие данные:

id <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
label <- c(6, 5, 1, 5, 4, 2, 3, 1, 6, 1)
predicted <- c(6, 5, 1, 3, 2, 2, 3, 1, 4, 4)
match <- c(1, 1, 1, 0, 0, 1, 1, 1, 0, 0)
dt <- data.frame(id, label, predicted, match)
head(dt)
  id label predicted match
1  1     6         6     1
2  2     5         5     1
3  3     1         1     1
4  4     5         3     0
5  5     4         2     0
6  6     2         2     1

Если я group_by(label) и count(label, predicted), а затем mutate(percent = sum(match == 1)/sum(n)), ожидается, что я должен получить новый сгруппированный кадр данных, подобный этому

library(plyr)
library(dplyr)
dt %>% group_by(label) %>% dplyr::count(label, predicted) %>% mutate(percent = sum(match == 1)/sum(n))

dt
   id label predicted match percent
1   3     1         1     1    0.67
2   8     1         1     1    0.67
3  10     1         4     0    0.67
4   6     2         2     1    1.00
5   7     3         3     1    1.00
6   5     4         2     0    0.00
7   4     5         3     0    0.50
8   2     5         5     1    0.50
9   9     6         4     0    0.50
10  1     6         6     1    0.50

Однако мой код дает мне следующий вывод вместо

dt
# A tibble: 6 x 4
# Groups:   label [5]
  label predicted     n percent
  <dbl>     <dbl> <int>   <dbl>
1  1.00      1.00     2   0.600
2  1.00      4.00     1   0.600
3  2.00      2.00     1   0.600
4  3.00      3.00     1   0.600
5  4.00      2.00     1   0.600
6  5.00      3.00     1   0.600

Он рассчитал процент правильного прогноза для «всего» * ​​1032 * (следовательно, все равно 0,600) вместо того, чтобы делать это для каждого label. Как мне изменить мой код для достижения желаемого результата?

1 Ответ

1 голос
/ 16 мая 2019

Я не смог воспроизвести ваш вывод с кодом, которым вы поделились. Я думаю, что следующее выполнит то, что вы ищете, хотя (я использовал total в качестве имени переменной, а не n):

dt %>% 
  arrange(label) %>% 
  group_by(label) %>% 
  mutate(total = n(), 
         percent = sum(match == 1) / total)
# A tibble: 10 x 6
# Groups:   label [6]
      id label predicted match total percent
   <dbl> <dbl>     <dbl> <dbl> <int>   <dbl>
 1     3     1         1     1     3   0.667
 2     8     1         1     1     3   0.667
 3    10     1         4     0     3   0.667
 4     6     2         2     1     1   1    
 5     7     3         3     1     1   1    
 6     5     4         2     0     1   0    
 7     2     5         5     1     2   0.5  
 8     4     5         3     0     2   0.5  
 9     1     6         6     1     2   0.5  
10     9     6         4     0     2   0.5 
...