2016-09-01 3 views
1

Sicher gibt es eine Funktion in einem Paket dafür?Berechnen des Modus oder 2/3/4 häufigsten Wert

Ich habe gesucht und ich habe diese Funktion zur Berechnung des Modus gefunden:

Mode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

Aber ich würde eine Funktion wie die ich leicht den 2./3./4./n gängigste Wert berechnen läßt in einer Spalte von Daten.

Letztendlich werde ich diese Funktion auf eine große Anzahl von dplyr::group_by() s anwenden.

Vielen Dank für Ihre Hilfe!

+1

Namen (Tabelle (x)) [1] –

+0

Das könnte eine sort() benötigen. Und das könnte natürlich verbessert werden, um mehrere Modi zu handhaben. –

Antwort

2

Vielleicht könnten Sie versuchen

f <- function (x) with(rle(sort(x)), values[order(lengths, decreasing = TRUE)]) 

Diese durch eine Verringerung der Frequenz einzigartige Vektorwerte sortiert gibt. Der erste ist der Modus, wird der zweite zweite sein am häufigsten usw.

Eine andere Methode basiert auf table():

g <- function (x) as.numeric(names(sort(table(x), decreasing = TRUE))) 

Aber dies wird nicht empfohlen, da Eingangsvektor x wird dazu gezwungen werden Faktor zuerst. Wenn Sie einen großen Vektor haben, ist dies sehr langsam. Auch beim Beenden müssen wir Charakternamen und die Tabelle extrahieren und auf numerisch erzwingen.


Beispiel

set.seed(0); x <- rpois(100, 10) 
f(x) 
# [1] 11 12 7 9 8 13 10 14 5 15 6 2 3 16 

die mit der Kontingenztafel vergleichen Lassen Sie sich von table:

tab <- sort(table(x), decreasing = TRUE) 
# 11 12 7 9 8 13 10 14 5 15 6 2 3 16 
# 14 14 11 11 10 10 9 7 5 4 2 1 1 1 

as.numeric(names(tab)) 
# [1] 11 12 7 9 8 13 10 14 5 15 6 2 3 16 

So die Ergebnisse die gleichen sind.

+0

Vielleicht 'Werte [Reihenfolge (Länge)]' 'für die Kürze –

+0

Ich höre dich. Nicht richtig oder falsch, nur kürzer. Sie könnten die 'T'- und' F'-Stickers verärgern. Sie mögen es nicht, die Logik zu verkürzen. –

Verwandte Themen