2016-10-17 1 views
1

Ich habe einen Datenrahmen, dass ich die Mehrheit mit einem Faktor, z.Mehrheitswahl in R

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

Der Ausgang

item majority_vote 
1  2 
2  NA 

Sie erkennen können die Beispieldaten aus here sein sollte, aber ich will nicht den Modus, möchte ich die tatsächliche Mehrheit der Stimmen (dh mehr als 1/erhalten 2 die Leute wählten diese Option). Daher sollte "Punkt 2" keine Mehrheit haben.

table() scheint mir nicht zu helfen, weil which.max() mir nur den modalen Wert geben wird. Ich muss 3 Dinge wissen, die Anzahl der Stimmen, die ich habe, den Namen dieser Option und die Anzahl, wie oft jemand für eine Option gestimmt hat. Ich kann die ersten beiden mit tapply(all_results_filtered$q1, all_results_filtered$X_row_id ,function(x) length(x)) bekommen und tapply(all_results_filtered$q1, all_results_filtered$X_row_id ,function(x) as.numeric(names(which.max(table(x))))), aber wie kann ich die Anzahl der Stimmen bekommen für which.max(table(x))

Oder ... gibt es eine einfachere Art und Weise, die ich bin fehlt? Danke! Hier

+0

'Aggregat (Kategorie ~ Artikel, df, Funktion (x) {y <- x [prop.table (Tabelle (x))> 0,5]; ifelse (any (is.null (y)), NA, unique (y))}) ', aber es könnte eine einfachere Option geben – alistaire

+0

Ah! Stehling Psidoms Indexierung von unten, eine einigermaßen nette Basisversion: 'Aggregat (Kategorie ~ Element, df, Funktion (x) {x [prop.table (Tabelle (x))> 0.5] [1]})' – alistaire

Antwort

1

ist eine dplyr Option:

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

Sie könnten vereinfachen : 'df%>% count (Element, Kategorie)%>% summary (Mehrheit_Vote = Kategorie [n> Summe (n/2)] [1])' – alistaire

+0

'count' und' summarise' ziehen immer die letzte Gruppierungsvariable ab , so lange die Parameter von 'group_by' /' count' 'item, category' statt umgekehrt sind, wird es bereits nach' item' für die 'summarise' gruppiert. Sie müssen jedoch 'sum' hinzufügen, weil' count' zusammenfasst statt mutiert. – alistaire

+0

Eigentlich gibt @ Alistaires Kommentar die bessere Antwort, weil es garantiert, dass Stimmen> n/2. Dein Kommentar gibt die Antwort von 1, wenn der Fall Votes = 3,0,1,1 ist. Alistare gibt NA korrekt. – jrubins