2016-10-17 2 views
1

У меня есть dataframe, который я хочу рассчитать большинством голосов на коэффициент, например.Большинство голосов в R

item category 
1  2 
1  3 
1  2 
1  2 
2  2 
2  3 
2  1 
2  1 

Выход должен быть

item majority_vote 
1  2 
2  NA 

Вы можете распознать данные примера из here, но я не хочу, чтобы режим, я хочу, чтобы получить фактическое большинство голосов (что означает более чем 1/2 люди выбрали этот вариант). Следовательно, «пункт 2» не должен иметь большинства.

table(), похоже, не помогает мне, потому что which.max() предоставит мне только модное значение. Мне нужно знать 3 вещи, количество голосов, которые у меня есть, имя этого параметра и количество голосов, проголосовавших за выбор. Я могу получить первые два с tapply(all_results_filtered$q1, all_results_filtered$X_row_id ,function(x) length(x)) и tapply(all_results_filtered$q1, all_results_filtered$X_row_id ,function(x) as.numeric(names(which.max(table(x))))), но как я могу получить количество голосов за which.max(table(x))

Или ... есть некоторые простой способ, что я не хватает? Спасибо!

+0

'совокупности (категория ~ элемент, DF, функция (х) {у <- х [prop.table (таблица (х))> 0,5]; IfElse (any (is.null (y)), NA, уникальный (y))}) ', но может быть более простой вариант – alistaire

+0

Ah! Кража индексации Psidom снизу, достаточно хорошая базовая версия: 'aggregate (category ~ item, df, function (x) {x [prop.table (table (x))> 0.5] [1]})' – alistaire

ответ

1

Вот dplyr вариант:

library(dplyr) 
df %>% 
     group_by(item, category) %>% 
     mutate(votes = n()) %>% 
     group_by(item) %>% 
     summarise(majority_vote = category[votes > n()/2][1]) 

# A tibble: 2 x 2 
# item majority_vote 
# <int>   <int> 
#1  1    2 
#2  2   NA 
+2

Вы можете упростить : 'df%>% count (item, category)%>% sumize (most_vote = category [n> sum (n/2)] [1])' – alistaire

+0

'count' и' summaryise' всегда отделяют последнюю переменную группировки , так что до тех пор, пока параметры 'group_by' /' count' будут 'item, category', а не наоборот, они уже будут сгруппированы по' item' для 'summaryize'. Вы должны добавить 'sum', хотя, потому что' count' суммирует вместо мутаций. – alistaire

+0

Собственно, комментарий @ alistaire дает лучший ответ, потому что он гарантирует, что голоса> n/2. Ваш комментарий дает ответ 1, когда случай является голосом = 3,0,1,1. Алистар правильно дает NA. – jrubins

Смежные вопросы