2017-08-30 2 views
0

Hintergrund Reinigung:R - dplyr Zusammenfassung und einen Datenrahmen mit mehreren Gruppen

ich großer Datenrahmen, den ich versuche zu filtern, aber falsche Gruppierungen machen es schwierig. Stellen Sie sich vor, Sie haben Verkaufsinformationen für ein Lebensmittelgeschäft mit hierarchischen Kategorien. Banane taucht dreimal auf: 2 mal als "Frucht" und einmal als "Fleisch". Ich weiß, dass der "Fleischverkauf" tatsächlich stattgefunden hat, also möchte ich ihn nicht loswerden, aber er vermasselt meine aggregierten Daten, auf die ich filtere (ich möchte nur Gruppierungen mit 3 oder mehr Instanzen behalten, Bananen würden verschwinden)).

Reproduzierbare Beispiel

x1 <- c('a','a','a','b','b','b') 
x2 <- c(1,1,4,5,2,2) 
x3 <- c(10,11,12,13,14,15) 
df = data.frame(x1,x2,x3) 

summarized = df %>% 
    group_by(x1, x2) %>% 
    summarize(Avg = mean(x3), 
      Times = n()) 

erstellt:

 x1 x2 Avg Times 
1  a  1 10.5  2 
2  a  4 12.0  1 
3  b  2 14.5  2 
4  b  5 13.0  1 

Die Gruppierung (a, 1) mehr als (a, 4), damit ich weiß, (a, 1) korrekt ist (Gleiches mit (b, 2) gegen (b, 5)). Ich suche für meinen Datenrahmen zu werden:

 x1 x2 Avg Times 
1  a  1 11  3 
2  b  2 14  3 

x2 wichtig ist für mich, da meine bedingte Formatierung zu halten basiert darauf, dass (das heißt, wenn x2 == 1 & AVG < 10 fällt dann anderes halten).

Bin es besser, wenn ich versuche, den Mittelwert/Zählung separat zu berechnen und dann die größte x2 hinzuzufügen? Danke im Voraus!

+0

Versuchen Sie, konsistente Beispiele zu geben. Bei der Beschreibung erklärst du es mit "Banane", "Fleisch" und in deinem reproduzierbaren Beispiel finde ich sie nicht. –

+0

Ich habe bemerkt, dass du keine Antworten auf die 6 Fragen, die du bis jetzt zu SO gestellt hast, angenommen hast. Bitte überlegen Sie, die Antworten zu akzeptieren, die Ihre Fragen lösen. –

Antwort

0

aktualisieren:

which.max standardmäßig wählt das erste Maximum, so im Fall, wenn wir müssen den letzten Eintrag mit maximalem Wert auswählen, wir können einfach rev die table Einträge auswählen und dann das Maximum auswählen.

df %>% 
    group_by(x1) %>% 
    summarise(x2 = names(which.max(rev(table(x2)))), 
      x3 = mean(x3), 
      Times = n()) 

Original-Antwort

Wir können group_byx1 und x2 auswählen, die für eine maximale Zeit auftritt, den Mittelwert von berechnen und die Anzahl der Zeilen (n()) für jede Gruppe zählen.

library(dplyr) 
df %>% 
    group_by(x1) %>% 
    summarise(x2 = names(which.max(table(x2))), 
      x3 = mean(x3), 
      Times = n()) 


#  x1 x2 x3 Times 
# <fctr> <chr> <dbl> <int> 
#1  a  1 11  3 
#2  b  2 14  3 
+0

Danke für die Hilfe! Was ist die Standardmethode, mit der which.max Verbindungen behandelt? wenn ich am Ende eine weitere Zeile (a, 4) hinzufüge, gibt diese Funktion mir (a, 2) immer noch in der zusammengefaßten Tabelle. Gibt es eine Möglichkeit, es umzuschalten, um die letzte Reihe aufzuheben, wenn es ein Gleichstand gibt (2 Zählungen von (a, 2) und 2 Zählungen von (a, 4)). – CoolGuyHasChillDay

+0

@CoolGuyHasChillDay Ich habe die Antwort entsprechend aktualisiert. Bitte guck dir das an. –

0

Wenn Sie wissen, ist die häufigste x2 innerhalb jeder x1 Gruppe die richtige ist Sie tun können:

correct_cats = df %>% 
    group_by(x1) %>% 
    count(x2) %>% 
    # Find most common x2 
    top_n(1, n) %>% 
    select(-n) 

df = df %>% 
    # Drop current x2 
    select(-x2) %>% 
    # Merge in corrected x2 
    left_join(correct_cats, by = 'x1') 

summarized = df %>% 
    group_by(x1, x2) %>% 
    summarize(Avg = mean(x3), 
       Times = n()) 
Verwandte Themen