2014-09-12 17 views
12

Ich möchte einen Datenrahmen durch eine Spalte (Eigentümer) gruppieren und einen neuen Datenrahmen ausgeben, der bei jeder Beobachtung Zählungen jeder Art eines Faktors enthält. Der reale Datenrahmen ist ziemlich groß und es gibt 10 verschiedene Faktoren. HierZusammenfassen von Zählern eines Faktors mit dplyr

ist ein Beispiel einer Eingangs:

library(dplyr) 
df = tbl_df(data.frame(owner=c(0,0,1,1), obs1=c("quiet", "loud", "quiet", "loud"), obs2=c("loud", "loud", "quiet", "quiet"))) 

    owner obs1 obs2 
1  0 quiet loud 
2  0 loud loud 
3  1 quiet quiet 
4  1 loud quiet 

Ich war für die Ausgabe suchen, der wie folgt aussieht:

out = data.frame(owner=c("0", "0", "1", "1"), observation=c("obs1", "obs2", "obs1", "obs2"), quiet=c(1, 0, 1, 2), loud=c(1, 2, 1, 0)) 

    owner observation quiet loud 
1  0  obs1  1 1 
2  0  obs2  0 2 
3  1  obs1  1 1 
4  1  obs2  2 0 

Schmelzen bringt mich partway dort:

melted = tbl_df(melt(df, id=c("owner"))) 

    owner variable value 
1  0  obs1 quiet 
2  0  obs1 loud 
3  1  obs1 quiet 
4  1  obs1 loud 
5  0  obs2 loud 
6  0  obs2 loud 
7  1  obs2 quiet 
8  1  obs2 quiet 

Aber was ist der letzter Schritt? Wenn "Wert" eine Zahl wäre, würde ich einfach gehen:

melted %>% group_by(owner, variable) %>% summarise(counts=sum(value)) 

Vielen Dank!

+0

Dies ist eine alte Frage gibt, aber für das, was es wert ist es ein wenig bekanntes Feature von 'dcast', die Ihnen erlaubt, Wenden Sie in diesen Fällen eine Aggregations-/Zusammenfassungsfunktion an. Ich denke, es zählt standardmäßig. – shadowtalker

Antwort

22

Sie tidyr mit dplyr

library(dplyr) 
library(tidyr) 

df %>% 
gather(observation, Val, obs1:obs2) %>% 
group_by(owner,observation, Val) %>% 
summarise(n= n()) %>% 
ungroup() %>% 
spread(Val, n, fill=0) 

verwenden könnte, die den Ausgang

# owner observation loud quiet 
    #1  0  obs1 1  1 
    #2  0  obs2 2  0 
    #3  1  obs1 1  1 
    #4  1  obs2 0  2 
+1

'df%>% sammeln (Beobachtung, Val, obs1: obs2)%>% group_by (Eigentümer, Variable, Wert)%>% zusammenfassen (n = n())%>% Spread (Wert, n, Füllung = 0) ' –

+0

@Rory Kirchner Die Spaltennamen sollten konsistent sein. Hier haben Sie in 'gather (...)' eine Variable 'Val' erzeugt, aber in' group_by (...) 'und später wurde diese Variable verworfen und an ihren Stellen wurde' value' verwendet. – akrun

+0

Hm-- Val -> Wert für mich: df%>% sammeln (Beobachtung, Val, obs1: obs2) -> Besitzer Variablenwert wie die Spaltennamen –

3

Wenn Sie die dplyr verzichten wollten gibt, sie in Listen aufteilen.

df <- split(df, list(df[[obs1]], df[[obs2]]) 

Wenn Sie die count wollten, erstellen Sie einfach einen sapply oder lapply Anruf durch die Listen laufen und die Zählung von jedem zu bekommen. Oder buchstäblich jede andere Funktion, die Sie wollen.

19

Im Jahr 2017 ist die Antwort

library(dplyr) 
library(tidyr) 

gather(df, key, value, -owner) %>% 
    group_by(owner, key, value) %>% 
    tally %>% 
    spread(value, n, fill = 0) 

Welche Ausgabe

Source: local data frame [4 x 4] 
Groups: owner, key [4] 

    owner key loud quiet 
* <dbl> <chr> <dbl> <dbl> 
1  0 obs1  1  1 
2  0 obs2  2  0 
3  1 obs1  1  1 
4  1 obs2  0  2 
+0

Dies ist die bessere Antwort in diesen Tagen. – Monduiz

Verwandte Themen