首页 > 解决方案 > 计数分类变量的模式计算

问题描述

这是我的数据集:

X Totally.Disagree Disagree Agree Totally.agree
0                2        9   111           122
1                2       30   124            88
2                4       31   119            90
3               10       43   138            53
4               33       54    85            72
5               43       79    89            33
6               48       83    94            19
7               51       98    80            15
8               50      102    75            17
9               51       96    80            17

其中 X(因此每行)是一个问题,值是选择该问题答案的人数。我想计算每个问题的模式(选择最多的答案)。

这是我尝试过的:

df <- gather(df,Answer, count, Totally.Disagree:Totally.agree )
df %>% 
  group_by(X, Answer) %>%
  summarise(sum = count)%>%
  summarise(mode = df$Answer[which(df$count== max(df$count))])

但它不起作用,因为它max(df$count)指的是整个数据集,而不仅仅是一个问题。

如果我尝试的方式是正确的,我现在不这样做。如果你们中的一个人能帮助我解决这个问题,我将不胜感激。

标签: rdplyrcategorical-datamode

解决方案


一种不同的方法可能是:

df %>%
 mutate(mode = max.col(.[2:length(.)])+1) %>%
 rowwise() %>%
 mutate(mode = names(.)[[mode]]) %>%
 select(X, mode)

       X mode         
   <int> <chr>        
 1     0 Totally.agree
 2     1 Agree        
 3     2 Agree        
 4     3 Agree        
 5     4 Agree        
 6     5 Agree        
 7     6 Agree        
 8     7 Disagree     
 9     8 Disagree     
10     9 Disagree  

在这里,它首先识别具有最大计数的列的索引,然后根据列索引分配列的名称。

如果您还想包括数字,您可以尝试:

df %>%
 mutate(mode = max.col(.[2:length(.)])+1) %>%
 rowwise() %>%
 mutate(mode_names =  names(.)[[mode]], 
        mode_numbers = max(!!! rlang::syms(names(.)[2:length(.)]))) %>%
 select(X, mode_names, mode_numbers)

       X mode_names    mode_numbers
   <int> <chr>                <dbl>
 1     0 Totally.agree         122.
 2     1 Agree                 124.
 3     2 Agree                 119.
 4     3 Agree                 138.
 5     4 Agree                  85.
 6     5 Agree                  89.
 7     6 Agree                  94.
 8     7 Disagree               98.
 9     8 Disagree              102.
10     9 Disagree               96.

或者按照你原来的逻辑:

df %>%
 gather(mode_names, mode_numbers, -X) %>%
 group_by(X) %>%
 filter(mode_numbers == max(mode_numbers)) %>%
 arrange(X)

       X mode_names    mode_numbers
   <int> <chr>                <int>
 1     0 Totally.agree          122
 2     1 Agree                  124
 3     2 Agree                  119
 4     3 Agree                  138
 5     4 Agree                   85
 6     5 Agree                   89
 7     6 Agree                   94
 8     7 Disagree                98
 9     8 Disagree               102
10     9 Disagree                96

推荐阅读