Расчет режима по подсчитанным категориальным переменным - PullRequest
0 голосов
/ 16 февраля 2019

Вот мой набор данных:

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) относится ко всему набору данных, а не только к одному вопросу.

Я делаюне сейчас, если способ, которым я пытался, верен.Если бы один из вас мог помочь мне решить эту проблему, я был бы очень благодарен.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Другой подход может быть следующим:

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
0 голосов
/ 16 февраля 2019

Если вам нужен только сам ответ (без цифр), и мы можем предположить, что связей нет, то

df <- gather(df, Answer, count, Totally.Disagree:Totally.agree)
df %>% group_by(X) %>% summarise(mode = Answer[which.max(count)])
# A tibble: 10 x 2
#        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

, где Answer[which.max(count)] - это в основном то, что вы намеревались сделать, но нетнужно df$, так как вы хотите, чтобы эти вычисления выполнялись по группам.

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