2016-04-18 9 views
0

Ich versuche, mit einem Datenrahmen unter Verwendung des dplyr Paket in R zu üben genannt fruit_eaten wie so:R: verschachtelte Gruppierungen und Gesamtzählungen über dplyr?

person,fruit 
Alice,apple 
Alice,apple 
Alice,apple 
Alice,orange 
Bob,apple 
Bob,banana 
Bob,grape 
Bob,grape 
Bob,grape 
Cheryl,orange 
Cheryl,orange 
Cheryl,kiwi 
Donald,apple 
Donald,apple 
Donald,grape 
Donald,grape 

Ich mag folgend mit dplyr tun:

Für jede Art von Obst berechnen sie die aßen die meisten davon (so ist dies keine einfache Zählung, möchte ich die maximale Anzahl zu finden) und wie viele dieser Tabelle zu produzieren:

| fruit | who_ate_most | how_many | 
|--------|--------------|----------| 
| apple | Alice  | 3  | 
| orange | Cheryl  | 2  | 
| banana | Bob   | 1  | 
| grape | Bob   | 3  | 
| kiwi | Cheryl  | 1  | 

Außerdem bin ich mir nicht sicher, wie ich mit Situationen umgehen soll, in denen zwei oder mehr Leute alle die gleiche maximale Anzahl an Früchten gegessen haben.

Und ich versuche, einen Tisch zu machen, dass jede Person und die Frucht auflistet, die sie aßen die meisten und wie viele:

| person | ate_most_of | how_many | 
|--------|-------------|----------| 
| Alice | apple  | 3  | 
| Bob | grape  | 3  | 
| Cheryl | orange  | 2  | 
| Donald | apple  | 2  | 

Natürlich ein ähnliches Problem für diese zweite Ausgabetabelle ist, was zu tun, wenn eine Person die gleiche maximale Anzahl von mehr als einer Frucht gegessen hat?

Ich kenne die group_by() Funktion in dplyr, aber sieht aus, als ob ich mehr als eine "Gruppe" hier habe. Und wie bekomme ich diese maximale Anzahl für die Spalten "how_many" in beiden Tabellen?

P.S. Die ursprünglichen Daten im Komma-Format (Pastebin-Link here).

+3

Können Sie die Eingabe in einem Format bereitzustellen, dem R-Code eingespeist werden kann als zu SQL-Ausgang dagegen? Dies kann getan werden, und ich kann helfen. Aber, werde nicht Zeit verbringen Text zu formatieren, um es in R zu bekommen. – Gopala

+0

@Gopala Ich habe CSV-Format am Ende des ursprünglichen Beitrags plus einen Pastebin Link hinzugefügt, funktioniert das? Vielen Dank!! – hpy

+1

@Frank Guter Punkt, Krawatte für Donald hinzugefügt. – hpy

Antwort

2

Für jede Art von Obst, berechnen, die am meisten davon aß (dies ist nicht eine einfache Zählung ist vielmehr eine maximale Anzahl):

df %>% 
    count(fruit, person) %>% 
    top_n(1) 

# fruit person  n 
# (fctr) (fctr) (int) 
# 1 apple Alice  3 
# 2 banana Bob  1 
# 3 grape Bob  3 
# 4 kiwi Cheryl  1 
# 5 orange Cheryl  2 

df %>% 
    count(person, fruit) %>% 
    top_n(1) 

# person fruit  n 
# (fctr) (fctr) (int) 
# 1 Alice apple  3 
# 2 Bob grape  3 
# 3 Cheryl orange  2 
# 4 Donald apple  2 
# 5 Donald grape  2 

Anbetracht dessen, dass count ein Wrapper für tally ist | summarise | n was macht die group_by für Sie. Beachten Sie den Unterschied in der Reihenfolge der zugrunde liegenden group_by. Beachten Sie auch, dass sich jede Zusammenfassung (die zugrunde liegende n() Zusammenfassung) auf einer Gruppierungsebene ablöst.


Per Kommentare über das Erhalten einen Datensatz pro Krawatte, können wir toString verwenden, wie von @Frank vorgeschlagen. Darüber hinaus können wir „halten“ n durch den first() Wert aus seinem Vektor extrahieren:

df %>% 
    count(person, fruit) %>% 
    top_n(1) %>% 
    summarise( n = first(n), 
      fruits = toString(fruit)) 

# person  n  fruits 
# (fctr) (int)  (chr) 
# 1 Alice  3  apple 
# 2 Bob  3  grape 
# 3 Cheryl  2  orange 
# 4 Donald  2 apple, grape 
+0

Vielen Dank, ich habe über die Funktion group_by() nachgedacht, hätte aber count() betrachten sollen. Gibt es eine Strategie für den Umgang mit Bindungen? – hpy

+1

Wie wollen Sie mit Krawatten umgehen? – JasonAizkalns

+1

Eine Option ist das Hinzufügen von '%>% summarize (fruit = toString (fruit))' am Ende (für die zweite Tabelle). Ich wette, es gibt auch eine Kleinigkeit dafür. – Frank