2017-07-25 5 views
0

ich einen Datenrahmen (DF) mit 3 Spalten: ID-Nummer, die Kategorie und Marke:R: Finden Sie zwei Strings am häufigsten zusammen pro Kategorie

ID    Category  Brand 
00129   Bits   B89 
00129   Bits   B87 
00129   Bits   B87 
00129   Logs   B32 
00129   Logs   B27 
00129   Logs   B27 
00130   Bits   B12 
00130   Bits   B14 
00130   Bits   B14 
00131   Logs   B32 
00131   Logs   B27 
00131   Logs   B32 
00132   Bits   B77 
00132   Bits   B89 
00132   Bits   B89 

Ich habe 200 verschiedene Kategorien und 2000 verschiedene Marken .

Ich will die beiden Marken pro Kategorie zusammen am häufigsten von ID-Nummern gekauft finden:

Category  Brand 
Bits   B89,B87 
Logs   B32,B27 

oder:

#$Bits 
    #[1] "B89" "B87" 

#$Logs 
    #[1] "B32" "B27" 

Die einzige Art, wie ich denken konnte, war den Datenrahmen zu überarbeiten so aussehen, um sicherzustellen, dass es mit Bestätigung der verschiedenen ID-Nummern berechnet wird:

Und dann wieder die Spalten, die mit Werten größer als 0 aufgefüllt werden, wenn eine bestimmte Spalte mit Werten größer als 0.

list1 =(setNames(object = lapply(1:NCOL(df), function(i) 
    unique(colnames(df)[-i][which(as.matrix(df[which(df[,i] > 0),i])>0, 
            arr.ind = TRUE)[,2]])), 
    nm = colnames(df))) 

bevölkert ist aber dann die Kategorie I opfern, was ich brauche. Irgendwelche Gedanken darüber, wie man das anpackt?

Antwort

0

Dies könnte den Trick tun. Endete mit einer Kombination aus data.table und dplyr, weil ich die data.table noch nicht wirklich kenne.

dt = data.table(read.table(text="ID    category    brand 
00129   Bits   B89 
00129   Bits   B87 
00129   Bits   B87 
00129   Logs   B32 
00129   Logs   B27 
00129   Logs   B27 
00130   Bits   B12 
00130   Bits   B14 
00130   Bits   B14 
00131   Logs   B32 
00131   Logs   B27 
00131   Logs   B32 
00132   Bits   B77 
00132   Bits   B89 
00132   Bits   B89",header=T)) 

library(data.table) 
library(dplyr) 

# get all combinations of two purchases. 
dt = dt[,.(list(unique(brand))),.(ID,category)][, .(combn(unlist(V1), 2,simplify=FALSE)),.(ID,category)] 

# concatenate those two purchases to a string 
dt$V1 = unlist(lapply(dt$V1,function(x) {paste(x,collapse=", ")})) 

# fetch only the top per category 
dt %>% group_by(V1,category) %>% summarize(n=n()) %>% group_by(category) %>% top_n(n = 1) %>% select(-n) 

Ausgang:

 V1 category 
1 B12, B14  Bits 
2 B32, B27  Logs 
3 B77, B89  Bits 
4 B89, B87  Bits 

Was ich denke, korrekt ist, Ihre Daten-Set unter Berücksichtigung, obwohl es nicht Ihre erwartete Ausgabe überein?

Optional

dt %>% group_by(ID,category) %>% mutate(unique_types = n_distinct(brand)) %>% filter(unique_types>1) 

vor hinzufügen, wenn es auch mit nur einer einzigen Marke kauft werden, da combn(n,m) wird nicht funktionieren, wenn length(n)<m

Verwandte Themen