2016-09-28 2 views
6

ich eine Tabelle mit zwei Spalten haben nämlich id und item:Finden häufigste Kombination in einem Vektor von Gruppen

df <- data.frame(id=c(1,1,2,2,2,2,3,3,3,4,4,4,4,4),item=c(1,2,3,1,2,3,4,1,2,3,1,2,1,2)) 

ich die häufigste Kombination finden wollen (Reihenfolge spielt keine Rolle) von 3 Artikel pro id. Also im Grunde, n wählen r wo n = number of items within id und r = 3. Die Anzahl der Artikel pro id variiert - einige haben mehr als 3, manche weniger.

Ich bin neu zu R und lese über combn und expand.grid, aber ich weiß nicht, wie man sie in meinem Fall (innerhalb jedes id) zu verwenden.

"Find most frequent combination of values in a data.frame" ist die nächste Frage, die ich gefunden habe.

EDIT: Die erwartete Antwort basierend auf dem Beispiel ist die Kombination "1, 2, 3", die in ID erscheint 2 und 4.

+3

Fügen Sie bitte das erwartete Ergebnis basierend auf den Beispieldaten t hinzu o Ihre Frage –

+0

Würde nicht 'n wählen r' eine Zahl zurückgeben? Sie können die Anzahl der Elemente pro 'ID 'mit @Stephen Antwort mit' group_by (id) 'finden. Möchten Sie alle Permutationen von 3 Zahlen betrachten und die häufigste aus 'n wähle r' Möglichkeiten anzeigen? – paulwasit

Antwort

2

Hier ist eine Idee mit dplyr

df1 <- df %>% 
     group_by(id) %>% 
     arrange(item) %>% 
     summarise(new = paste(unique(combn(item, length(unique(item)), toString)), collapse = '/')) 
df1 
# A tibble: 4 × 2 
#  id            new 
# <dbl>           <chr> 
#1  1           1, 2 
#2  2      1, 2, 3/1, 3, 3/2, 3, 3 
#3  3           1, 2, 4 
#4  4 1, 1, 2/1, 1, 3/1, 2, 2/1, 2, 3/2, 2, 3 

names(sort(table(unlist(strsplit(df1$new, '/'))), decreasing = TRUE)[1]) 
#[1] "1, 2, 3" 
+0

Vielen Dank. Dies ist eine großartige Lösung. Ich muss etwas vermissen, weil ich genau das gleiche 'df1' bekomme, aber wenn ich das letzte Bit' names (... 'laufe), bekomme ich' [1] "1, 1, 3" ' – DGenchev

+0

aktualisiert ... – Sotos

0
library(dplyr) 
grouped <- df %>% group_by(id,item) %>% summarize(count = n()) %>% arrange(desc(count)) 

Voila. Die höchsten Zählungen werden vom höchsten zum niedrigsten sortiert.

EDIT: Nur realisiert, dass ich Ihre Frage nicht vollständig beantwortet habe. Ich hoffe, ich habe dir einen guten Start gegeben.

+0

Danke für die schnelle Antwort. Ich habe gerade das erwartete Ergebnis wie gewünscht hinzugefügt. Ich suche die häufigste Kombination von Gegenständen, nicht die häufigste Ware. – DGenchev

0

Ich denke, das ist, was Sie Basis R verwenden möchten (kein Paket erforderlich):

a <- aggregate(item~id, df, unique) 
a <- lapply(a$item, 'length<-', max(lengths(a$item))) 
m <- matrix(unlist(a), ncol=3, byrow = T) 
m <- t(apply(m,1,function(x) sort(x,na.last = T))) 

#  [,1] [,2] [,3] 
#[1,] 1 2 NA 
#[2,] 1 2 3 
#[3,] 1 2 4 
#[4,] 1 2 3 

Sobald wir Matrix erhalten m, die häufigste Reihe der Matrix ist was Sie wollen:

t <- table(apply(m, 1, paste, collapse = "/")) 
as.numeric(strsplit(names(which.max(t)), "/")[[1]]) 

#[1] 1 2 3 
+0

Danke für die Antwort, aber ich sehe nicht, wie Aggregat kümmert sich um die verschiedenen Kombinationen innerhalb einer ID möglich.Es scheint nur die ersten 3 Elemente in jedem zu nehmen .. – DGenchev

+0

@DGenchev aktualisiert meinen Beitrag. Wie es aussieht für eindeutige Elemente pro 'id', die Reihenfolge, die Sie sehen, ist zufällig und wenn Sie die Reihenfolge in der ursprünglichen 'df' ändern, sehen Sie, wie es funktioniert. – 989

+0

OK, ich denke, ich verstehe es jetzt, aber es wird fallen wenn eine Gruppe mehr Elemente als alle anderen hat (dh alle anderen Gruppen haben NAs und die mit mehr Elementen wird an die Spitze gesetzt.) Ich habe es getestet, indem ich einen weiteren Datensatz mit 'id = 4' und ' Artikel = 5' – DGenchev

Verwandte Themen