Stata has a very nice command, egen
, which makes it easy to compute statistics over group of observation. For instance, it is possible to compute the max, the mean and the min for each group and add them as a variable in the detailed data set. The Stata command is one line of code :
by group : egen max = max(x)
I've never found the same command in R. summarise
in the dplyr
package makes it easy to compute statistics for each group but then I have to run a loop to associate the statistic to each observation :
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]
}
Does any one has a better solution ?
The Stata command egen, which stands for extended generation, is used to create variables that require some additional function in order to be generated. Examples of these function include taking the mean, discretizing a continuous variable, and counting how many from a set of variables have missing values.
Introduction. Stata has two built-in variables called _n and _N. _n is Stata notation for the current observation number. _n is 1 in the first observation, 2 in the second, 3 in the third, and so on. _N is Stata notation for the total number of observations.
by and bysort are really the same command; bysort is just by with the sort option. The varlist1 (varlist2) syntax is of special use to programmers. It verifies that the data are sorted. by varlist1 varlist2 and then performs a by as if only varlist1 were specified.
isid checks whether the specified variables uniquely identify the observations. sort specifies that the dataset be sorted by varlist. missok indicates that missing values are permitted in varlist. Suppose that we want to check whether the mileage ratings (mpg) uniquely identify the observations in our auto dataset.
Here are a few approaches:
dplyr
library(dplyr)
tf %>% group_by(group) %>% mutate(max = max(x))
ave
This uses only the base of R:
transform(tf, max = ave(x, group, FUN = max))
data.table
library(data.table)
dt <- data.table(tf)
dt[, max:=max(x), by=group]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With