2014-06-11 10 views
7

Stata ha un comando molto bello, egen, che semplifica il calcolo delle statistiche rispetto al gruppo di osservazione. Ad esempio, è possibile calcolare il massimo, la media e il minimo per ciascun gruppo e aggiungerli come variabile nel set di dati dettagliato. Il comando di Stata è una riga di codice:esiste un equivalente della funzione egen di Stata?

by group : egen max = max(x) 

non ho mai trovato lo stesso comando in R. summarise nel pacchetto dplyr lo rende facile da calcolare le statistiche per ogni gruppo, ma poi devo correre un ciclo per associare la statistica ad ogni osservazione:

library("dplyr") 
N <- 1000 
tf <- data.frame(group = sample(1:100, size = N, replace = TRUE), x = rnorm(N)) 
table(tf$group) 
mtf <- summarise(group_by(tbl_df(tf), group), max = max(x)) 
tf$max <- NA 
for (i in 1:nrow(mtf)) { 
    tf$max[tf$group == mtf$group[i]] <- mtf$max[i] 
} 

Qualcuno ha una soluzione migliore?

+0

C'è un certo numero di alternative. La tua domanda mostra una mancanza di ricerca (non hai nemmeno studiato la vignetta del pacchetto dplyr). -1 – Roland

+1

Non ho pregiudizi nei confronti di 'egen' (ho scritto alcune delle funzioni) ma anche da un punto di vista Stata è solo una pratica raccolta di elementi per creare variabili. Non esiste un'idea centrale che rappresenti su tutto ciò che sarebbe un'idea centrale in R. Anche la convenienza di produrre statistiche riassuntive per gruppo non fa in effetti parte della definizione o del ruolo di "egen", ma solo di qualcosa che è possibile con alcune delle sue componenti. Non parlerò per R ma sospetto che alcuni dei suoi pacchetti siano anche un po 'diversi. –

+0

Sono d'accordo con te ma è comunque molto utile. – PAC

risposta

12

Ecco alcuni approcci:

dplyr

library(dplyr) 

tf %>% group_by(group) %>% mutate(max = max(x)) 

ave

Questo utilizza solo la base di R:

transform(tf, max = ave(x, group, FUN = max)) 

data.table

library(data.table) 

dt <- data.table(tf) 
dt[, max:=max(x), by=group]