2016-04-14 1 views
1

Schnell Beispiel der Zusammenfassung:effiziente Weise mehrere Male mit dplyr

set.seed(123) 
library("dplyr") 
df <- data_frame(client=sample(letters, 200, replace=T), 
       content=sample(LETTERS, 200, replace=T)) 

Ich habe Beobachtungen von Client mit Inhalten interagieren. Ich möchte wissen, wie viele verschiedene Inhalte von jedem Kunden verwendet wurden.

ich folgendes zu bekommen, was ich will:

df %>% 
    group_by(client, content) %>% 
    summarize(n=n()) %>% 
    summarize(n_content=n()) 

# output 
    client n_content 
    (chr)  (int) 
1  a   3 
2  b   4 
3  c   5 
.. ...  ... 

Der springende Punkt der ersten summarize ist nur eine Zeile pro Client/content Kombination zu erhalten (da ein Client den gleichen Inhalt mehrmals verwenden). Daher ist die Ausgabe der ersten n() nutzlos für mich, was mich denken lässt, dass es eine effizientere/elegantere Lösung geben muss.

Gibt es eine Möglichkeit, dies effizienter zu tun? Ich suche eine Lösung, die ideal mit dplyr kompatibel ist, aber Base R oder andere Pakete sind in Ordnung. Ich bin nicht an Lösungen interessiert, die data.table verwenden.

Antwort

2

Oder mit group_by

df %>% 
    group_by(client) %>% 
    summarize(n_content=n_distinct(content)) 

So etwas schneller

f1=function() df %>% 
    group_by(client) %>% 
    summarize(n_content=n_distinct(content)) 

f2=function()df %>% 
    distinct() %>% 
    count(client) 
microbenchmark(f1(),f2()) 

Unit: milliseconds 
expr  min  lq  mean median  uq  max neval cld 
f1() 1.884358 1.996009 2.307482 2.123363 2.598729 3.318076 100 a 
f2() 2.434831 2.532641 3.031416 2.817830 3.360372 5.462430 100 b 
2

Sie könnten tun:

df %>% 
    distinct() %>% 
    count(client) 

Source: local data frame [26 x 2] 

    client  n 
    (chr) (int) 
1  a  3 
2  b  4 
3  c  5 
4  d 10 
5  e  5 
6  f  6 
7  g  8 
8  h  5 
9  i  7 
10  j 10 
.. ... ...