2016-03-31 18 views
1

Ich versuche einige Daten in einem Datenrahmen zu gruppieren und einige Berechnungen über die Ergebnisse über eine Schleife durchzuführen.Looping über mehrere Spalten in einem Datenrahmen in R

Nehmen Sie das folgenden dataframe- "age_wght"

Year Last_Name First_Name Age Weight 
1 2000  Smith  John 20 145 
2 2000  Smith  Matt 9  85 
3 2005  Smith  John 25 160 
4 2000  Jones  Bob 12 100 
5 2000  Jones  Mary 18 120 
6 2005  Jones  Mary 23 130 
7 2000  Jones  Carrie 9  90 
8 2005  Jones  Bob 17 210 

Ich durchschnittliches Alter und Gewicht für jede Person zu bekommen versuchen.

Ich kann das tapply über tun:

age_wght $ key1 = Paste (age_wght $ Last_Name, age_wght $ First_Name, sep =“: Aktuell über mich dies berechnen, indem eine neue Schlüsselspalte in dem Datenrahmen zu schaffen. „)

Year Last_Name First_Name Age Weight  key1 
1 2000  Smith  John 20 145 Smith.John 
2 2000  Smith  Matt 9  85 Smith.Matt 
3 2005  Smith  John 25 160 Smith.John 
4 2000  Jones  Bob 12 100 Jones.Bob 
5 2000  Jones  Mary 18 120 Jones.Mary 
6 2005  Jones  Mary 23 130 Jones.Mary 

Dann tapply wie unten verwenden:

avg_age < - mit (age_wght, tapply (Alter, key1, FUN = Mittelwert))

avg_wght < -mit (age_wght, tapply (Gewicht, key1, FUN = Mittelwert))

age_wght_summary < - data.frame (avg_age, avg_wght)

age_wght_summary

Aber was bekomme ich dann ist etwas, das wie folgt aussieht:

   avg_age avg_wght 
Jones.Bob  14.5 155.0 
Jones.Carrie  9.0  90.0 
Jones.Mary  20.5 125.0 
Smith.John  22.5 152.5 
Smith.Matt  9.0  85.0 

was Sinn macht, wie ich die tapply auf dem Schlüssel1 Index am platzieren, aber mein gewünschten Ergebnis ist 9 eine Tabelle mit den Header haben: Last_Name First_Name avg_age avg_wght

Ich habe auch versucht, die dplyr-Bibliothek mit group_by aber war nicht in der Lage, es zur Arbeit zu bringen.

+0

Verwenden 'aggregate' wie -' Aggregat (cbind (Alter , Gewicht) ~ Last_Name + Fi rst_Name, data = dat, FUN = mean) ' – thelatemail

Antwort

0

A dplyr Lösung

library(dplyr) 

age_wght %>% 
    group_by(Last_Name, First_Name) %>% 
    summarise(avg_age = mean(Age), 
         avg_wght = mean(Weight)) 

# Last_Name First_Name avg_age avg_wght 
#  (fctr)  (fctr) (dbl) (dbl) 
# 1  Jones  Bob 14.5 155.0 
# 2  Jones  Carrie  9.0  90.0 
# 3  Jones  Mary 20.5 125.0 
# 4  Smith  John 22.5 152.5 
# 5  Smith  Matt  9.0  85.0 

A data.table Lösung

library(data.table) 
setDT(age_wght)[, .(avg_age = mean(Age), avg_wght = mean(Weight)), by=.(Last_Name, First_Name)] 

# Last_Name First_Name avg_age avg_wght 
# 1:  Smith  John 22.5 152.5 
# 2:  Smith  Matt  9.0  85.0 
# 3:  Jones  Bob 14.5 155.0 
# 4:  Jones  Mary 20.5 125.0 
# 5:  Jones  Carrie  9.0  90.0 
+0

Sie können auch' summaris_each' verwenden wie - 'dat%>% group_by (Nachname, Vorname)%>% summary_each (., funs (mean))' – thelatemail

+0

@thelatemail - danke ; Ich vergesse immer 'summarize_each' ... – SymbolixAU

+0

Die data.table-Lösung funktionierte perfekt für mich, danke! – boydok

0

A base R Lösung:

nms <- strsplit(rownames(age_wght_summary), split= "\\.") 
data.frame(last_name= lapply(nms, "[", 1), 
      first_name=lapply(nms, "[", 2), 
      avg_age= age_wht_summary$avg_age, 
      avg_age= age_wht_summary$avg_wght) 
Verwandte Themen