2016-05-11 8 views
3

Daten: -Aggregate-Funktion in R mit zwei Spalten gleichzeitig

df=data.frame(Name=c("John","John","Stacy","Stacy","Kat","Kat"),Year=c(2016,2015,2014,2016,2006,2006),Balance=c(100,150,65,75,150,10)) 

    Name Year Balance 
1 John 2016  100 
2 John 2015  150 
3 Stacy 2014  65 
4 Stacy 2016  75 
5 Kat 2006  150 
6 Kat 2006  10 

Code: -

aggregate(cbind(Year,Balance)~Name,data=df,FUN=max) 

Ausgang: -

Name Year Balance 
1 John 2016  150 
2 Kat 2006  150 
3 Stacy 2016  75 

ich aggregieren will/fasst die oben genannten Daten Rahmen mit zwei Spalten, die Jahr und Balance sind. Ich habe dazu die Basisfunktion aggregate verwendet. Ich brauche die maximale Bilanz des letzten Jahres/letzten Jahres. Die erste Zeile in der Ausgabe, John hat das letzte Jahr (2016), aber die Bilanz von (2015), was nicht das ist, was ich brauche, sollte 100 und nicht 150 ausgeben. Wo gehe ich falsch damit?

Antwort

7

Etwas ironisch, aggregate ist ein schlechtes Werkzeug für die Aggregation. Sie könnten es funktioniert, aber ich würde stattdessen tun:

library(data.table) 

setDT(df)[order(-Year, -Balance), .SD[1], by = Name] 
# Name Year Balance 
#1: John 2016  100 
#2: Stacy 2016  75 
#3: Kat 2006  150 
3

Ich werde vorschlagen, die Bibliothek dplyr verwenden:

data.frame(Name=c("John","John","Stacy","Stacy","Kat","Kat"), 
      Year=c(2016,2015,2014,2016,2006,2006), 
      Balance=c(100,150,65,75,150,10)) %>% #create the dataframe 
    tbl_df() %>% #convert it to dplyr format 
    group_by(Name, Year) %>% #group it by Name and Year 
    summarise(maxBalance=max(Balance)) %>% # calculate the maximum for each group 
    group_by(Name) %>% # group the resulted dataframe by Name 
    top_n(1,maxBalance) # return only the first record of each group 
+2

Nice one, aber ich würde mit der Kopie von Antwort des @ eddi gehen : 'df%>% group_by (Name)%>% anordnen (desc (Jahr), desc (Balance))%>% filter (1)' –

+0

@MaratTalipov nette Antwort! – xirururu

3

Hier ist eine andere Lösung ohne die data.table Paket.

zuerst sortieren der Datenrahmen,

df <- df[order(-df$Year, -df$Balance),] 

dann die erste Auswahl in jeder Gruppe mit dem gleichen Namen

df[!duplicated[df$Name],] 
Verwandte Themen