2016-05-04 9 views
0

Ich versuche, die R dplyr Paket mit einem hypothetischen Datensatz (link to pastebin) der Volkstrink Aufzeichnungen an verschiedenen Bars zu üben:R: verschachtelte gruppierte Zusammenfassungen mit dplyr?

bar_name,person,drink_ordered,times_ordered,liked_it 
Moe’s Tavern,Homer,Romulan ale,2,TRUE 
Moe’s Tavern,Homer,Scotch whiskey,1,FALSE 
Moe’s Tavern,Guinan,Romulan ale,1,TRUE 
Moe’s Tavern,Guinan,Scotch whiskey,3,FALSE 
Moe’s Tavern,Rebecca,Romulan ale,2,FALSE 
Moe’s Tavern,Rebecca,Scotch whiskey,4,TRUE 
Cheers,Rebecca,Budweiser,1,TRUE 
Cheers,Rebecca,Black Hole,1,TRUE 
Cheers,Bender,Budweiser,1,FALSE 
Cheers,Bender,Black Hole,1,TRUE 
Cheers,Krusty,Budweiser,1,TRUE 
Cheers,Krusty,Black Hole,1,FALSE 
The Hip Joint,Homer,Scotch whiskey,3,FALSE 
The Hip Joint,Homer,Corona,1,TRUE 
The Hip Joint,Homer,Budweiser,1,FALSE 
The Hip Joint,Krusty,Romulan ale,3,TRUE 
The Hip Joint,Krusty,Black Hole,4,FALSE 
The Hip Joint,Krusty,Corona,1,TRUE 
The Hip Joint,Rebecca,Corona,2,TRUE 
The Hip Joint,Rebecca,Romulan ale,4,FALSE 
The Hip Joint,Bender,Corona,1,TRUE 
Ten Forward,Bender,Romulan ale,1, 
Ten Forward,Bender,Black Hole,,FALSE 
Ten Forward,Guinan,Romulan ale,2,TRUE 
Ten Forward,Guinan,Budweiser,,FALSE 
Ten Forward,Krusty,Budweiser,1, 
Ten Forward,Krusty,Black Hole,1,FALSE 
Mos Eisley,Krusty,Black Hole,1,TRUE 
Mos Eisley,Krusty,Corona,2,FALSE 
Mos Eisley,Krusty,Romulan ale,1,TRUE 
Mos Eisley,Homer,Black Hole,1,TRUE 
Mos Eisley,Homer,Corona,2,FALSE 
Mos Eisley,Homer,Romulan ale,1,TRUE 
Mos Eisley,Bender,Black Hole,1,TRUE 
Mos Eisley,Bender,Corona,2,FALSE 
Mos Eisley,Bender,Romulan ale,1,TRUE 

I dplyr der group_by() und summarise() Funktionen ein paar Mal benutzt haben, aber ich bin nicht sicher, wie man mit verschachtelten Situationen umgeht. Insbesondere möchte ich Fragen wie:

  1. Für jeden eindeutigen bar_name, hat jeder person um genau die gleiche Kombination von Getränken (drink_ordered)? In diesem Datensatz wäre dies TRUE für die Bars Moe's Tavern, Cheers und Mos Eisley markiert.

  2. Auch wenn jeder person bestellt genau die gleiche Kombination von Getränken in einem bestimmten bar_name, haben sie die Getränke die gleiche Anzahl (times_ordered) bestellen? Zum Beispiel würden Moe's Tavern und Mos Eisley als TRUE für diese Frage markiert werden. Dann

  3. , auch wenn jeder person genau die gleiche Kombination von Getränken bestellt in einer bestimmten Bar die gleiche Anzahl, wie oft sind ihre Meinungen (liked_it) der Getränke genau das gleiche? In diesem Datensatz wäre das TRUE für Mos Eisley.

dass Beachten Sie im Datensatz gibt es Fälle (Hüftgelenk), wo die Antwort FALSE für alle drei Fragen sein würde, und es gibt fehlende Werte (Ten Forward).

Idealerweise Ich hoffe, eine Tabelle zu erzeugen, wobei die erste Spalte bar_name ist, und drei weitere boolean Spalten TRUE oder FALSE für jede der drei Fragen sagen.

Wie erreiche ich dies effizient mit dplyr in R? Vielen Dank.

+1

@Frank Vielen Dank für den Fehler zu Ten nach vorne zu bemerken, korrigiert. – hpy

Antwort

5

Sie tun können:

DF %>% 
    arrange(drink_ordered, times_ordered, liked_it) %>% group_by(bar_name, person) %>% 
    summarise(
    Ld = toString(drink_ordered), 
    Ldt = paste(Ld, toString(times_ordered), sep="_"), 
    Ldtl = paste(Ldt, toString(liked_it), sep="_") 
) %>% 
    group_by(bar_name) %>% 
    summarise_each(funs(n_distinct)) %>% 
    mutate_each(funs(. == 1), -person, -bar_name) 

#  bar_name person Ld Ldt Ldtl 
#   (chr) (int) (lgl) (lgl) (lgl) 
# 1  Cheers  3 TRUE TRUE FALSE 
# 2 Moe’s Tavern  3 TRUE FALSE FALSE 
# 3 Mos Eisley  3 TRUE TRUE TRUE 
# 4 Ten Forward  3 FALSE FALSE FALSE 
# 5 The Hip Joint  4 FALSE FALSE FALSE