2014-06-11 11 views
7

Stata ma bardzo ładne polecenie, egen, co ułatwia obliczanie statystyk w grupie obserwacji. Na przykład, możliwe jest obliczenie maksimum, średniej i min. Dla każdej grupy i dodanie ich jako zmiennej do szczegółowego zestawu danych. Komenda Stata jest jedna linia kodu:czy istnieje odpowiednik funkcji egipskiej Staty?

by group : egen max = max(x) 

Nigdy nie znaleziono tego samego polecenia w R. summarise w pakiecie dplyr ułatwia obliczenie statystyki dla każdej z grup, ale potem muszę uruchomić pętlę powiąż statystykę z każdą obserwacją:

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] 
} 

Czy ktoś ma lepsze rozwiązanie?

+0

Istnieje wiele alternatyw. Twoje pytanie pokazuje brak badań (nawet nie studiowałeś winiety pakietu dplyr). -1 – Roland

+1

Nie mam uprzedzeń wobec 'egen' (napisałem niektóre funkcje), ale nawet z punktu widzenia Stata jest to po prostu przydatny zbiór rzeczy do tworzenia zmiennych. Nie ma centralnej idei, która mapowałaby wszystko, co byłoby główną ideą w R. Nawet wygoda tworzenia statystyk podsumowujących według grupy nie jest w rzeczywistości częścią definicji lub roli 'egen', ale po prostu czymś możliwym z niektórymi jej składnikami. Nie będę mówił za R, ale podejrzewam, że niektóre z jego pakietów są również różne. –

+0

Zgadzam się z tobą, ale nadal jest to bardzo przydatne. – PAC

Odpowiedz

12

tutaj kilka podejść:

dplyr

library(dplyr) 

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

ave

jest użycie tylko podstawę R:

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

data.table

library(data.table) 

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