2016-04-20 14 views
1

Wenn ich einen Datenrahmen, wie:Dividieren Spalte von Daten durch den Mittelwert der Gruppe R

group=rep(1:4,each=10) 
data=c(seq(1,10,1),seq(5,50,5),seq(20,11,-1),seq(0.3,3,0.3)) 
DF=data.frame(group,data) 

Jetzt möchte ich durch den Mittelwert der Gruppe jedes data Element teilen möchten. Zum Beispiel:

group=rep(1:4,each=10) 
data=c(seq(1,10,1),seq(5,50,5),seq(20,11,-1),seq(0.3,3,0.3)) 
DF=data.frame(group,data) 
aggregate(DF,by=list(DF$group),FUN=mean) 

#Group.1 group data 
#1  1  1 5.50 
#2  2  2 27.50 
#3  3  3 15.50 
#4  4  4 1.65 

data1=c(seq(1,10,1)/5.5,seq(5,50,5)/27.5,seq(20,11,-1)/15.5,seq(0.3,3,0.3)/1.65) 
DF1=data.frame(group, data1) 

Dies ist jedoch ein wenig verschachtelt, und funktioniert nicht einfach in einem großen Dataset. Ich habe das Gefühl, dass es eine apply Anwendung gibt, die hier verwendet werden könnte, aber ich finde keinen guten Weg, dies zu tun.

+1

'DF $ newdata = DF $ data/ave (DF $ data, DF $ Gruppe, FUN = meinen) '? – Frank

+0

Ich war nicht bewusst, 'Ave'. Vielen Dank! – sym246

+1

Beachten Sie, dass 'mean' der Standardwert von' FUN = 'ist. –

Antwort

2

Hier ist die übliche Reihe von Optionen (dank @ G.Grothendieck zur Vereinfachung der ave):

# base R 
DF$newdata = ave(DF$data, DF$group, FUN = function(x) x/mean(x)) 
# or... 
DF$newdata = DF$data/ave(DF$data, DF$group) 

# dplyr 
library(dplyr) 
DF %>% group_by(group) %>% mutate(newdata = data/mean(data)) 

# data.table 
library(data.table) 
setDT(DF)[, newdata := data/mean(data), by=group] 
+1

Scheint zu spezifisch für einen Fall zu finden, aber es kann einen geben ... – Frank

Verwandte Themen