2016-04-22 2 views
0

Anders ausgedrückt, wie aggregieren Sie eine Spalte (z. B. die column), während eine andere die gleiche bleibt (z. B. die location)?R & dplyr: wie mehr Spalten aus dem ursprünglichen Datenrahmen/Datentabelle nach summarize() enthalten?

Diese MWE veranschaulicht mein Problem. Wie würde ich nach summarise() in der location Spalte hinzufügen? Gibt es eine Lösung, die "eine Ebene höher geht" vor der summarise(), damit ich die ursprünglichen Spalten beibehalten kann?

test <- as.data.table(data.frame(event_id = c("A","B","A","A","B"), 
           income = c(1,2,3,4,5), 
           location = c("PlaceX","PlaceY","PlaceX","PlaceX","PlaceY"))) 

test 

    event_id income location 
1:  A  1 PlaceX 
2:  B  2 PlaceY 
3:  A  3 PlaceX 
4:  A  4 PlaceX 
5:  B  5 PlaceY 

test %>% 
    group_by(event_id) %>% 
    summarise(mean_inc = mean(income)) 

Source: local data table [2 x 2] 

    event_id mean_inc 
    (fctr) (dbl) 
1  A 2.666667 
2  B 3.500000 

Die folgende funktioniert nicht:

test %>% 
    group_by(event_id) %>% 
    summarise(mean_inc = mean(income), 
    location = location) 

Source: local data table [5 x 3] 

    event_id mean_inc location 
    (fctr) (dbl) (fctr) 
1  A 2.666667 PlaceX 
2  A 2.666667 PlaceX 
3  A 2.666667 PlaceX 
4  B 3.500000 PlaceY 
5  B 3.500000 PlaceY 

Meine gewünschte Ausgabe ist:

Source: local data table [2 x 3] 

    event_id location mean_inc 
    (fctr) (fctr) (dbl) 
1  A PlaceX 2.666667 
2  B PlaceY 3.500000 
+1

In diesem speziellen Fall können Sie einfach etwas wie 'location = unique (location)' oder include 'location' in' group_by' verwenden. Haben Sie einen komplizierteren Anwendungsfall? – aosmith

+0

Danke, aber meine Daten haben mindestens 100 Variablen, so dass die Lösung schwer sauber zu skalieren scheint. – user2205916

+1

Dann denke ich, dass dies ein besserer Ort sein könnte, um 'mutate' und dann' distinct' mit '.keep_all = TRUE' anstelle von' summarise' zu ​​verwenden. – aosmith

Antwort

1

Ich hoffe, ich habe Ihre Wünsche verstanden. Führen Sie eine inner_join die fehlenden Spalten zu erholen (vorausgesetzt, sie sind aufeinander abgestimmt 1-1 mit dem group_by Argument):

newtest <- test %>% 
    group_by(event_id) %>% 
    summarise(mean_inc = mean(income)) %>% inner_join(test[-(1:2)]) 
#Joining by: "event_id" 
newtest 
#----------------- 
Source: local data table [3 x 4] 

    event_id mean_inc income location 
    (fctr) (dbl) (dbl) (fctr) 
1  A 2.666667  3 PlaceX 
2  A 2.666667  4 PlaceX 
3  B 3.500000  5 PlaceY 

Es ist auch möglich, dass Sie sowohl auf event_id und Lage passen wollte:

test %>% 
    group_by(event_id,location) %>% 
    summarise(mean_inc = mean(income)) 
#--------- 
#Source: local data table [2 x 3] 
#Groups: event_id 

    event_id location mean_inc 
    (fctr) (fctr) (dbl) 
1  A PlaceX 2.666667 
2  B PlaceY 3.500000 
+1

Für den zweiten Ansatz ist die SE-Version von 'group_by_' nützlich, wenn Sie von alles außer einer Spalte gruppieren möchten und Sie eine Menge von ihnen haben:' test% >% group_by _ (. dots = namen (test) [- 2])%>% summieren (mean_inc = mean (einkommen)) ' – alistaire

0

Ein Option könnte sein, mutate zu verwenden und dann nur einen Wert pro Gruppe über distinct herauszuziehen.

Die Nützlichkeit davon hängt vom tatsächlichen Anwendungsfall ab: Dies scheint am nützlichsten, wenn Ihre neue Variable denselben Namen wie die ursprüngliche Variable hat, die sie zusammenfasst. Andernfalls würden Sie am Ende Ihre ursprüngliche, nicht kumulierte Variable im endgültigen Datensatz haben.

distinct funktioniert hier, weil das Objekt noch gruppiert ist.

test %>% 
    group_by(event_id) %>% 
    mutate(income = mean(income)) %>% 
    distinct() 

Source: local data table [2 x 3] 

    event_id income location 
    (fctr) (dbl) (fctr) 
1  A 2.666667 PlaceX 
2  B 3.500000 PlaceY 

In dplyr_0.4.3.9000 würden Sie .keep_all = TRUE in distinct benötigen.