Cuantiles por niveles de factor en R

Tengo un marco de datos y estoy tratando de crear una nueva variable en el marco de datos que tiene los cuantiles de una variable continuavar1, para cada nivel de un factorstrata.

# some data
set.seed(472)
dat <- data.frame(var1 = rnorm(50, 10, 3)^2,
                  strata = factor(sample(LETTERS[1:5], size = 50, replace = TRUE))
                  )

# function to get quantiles
qfun <- function(x, q = 5) {
    quantile <- cut(x, breaks = quantile(x, probs = 0:q/q), 
        include.lowest = TRUE, labels = 1:q)
    quantile
}

Intenté usar dos métodos, ninguno de los cuales produce un resultado utilizable. En primer lugar, traté de usaraggregate Aplicarqfun a cada nivel destrata:

qdat <- with(dat, aggregate(var1, list(strata), FUN = qfun))

Esto devuelve los cuantiles por nivel de factor, pero es difícil coaccionar la salida en un marco de datos (por ejemplo, usandounlist no alinea los nuevos valores de las variables con las filas correctas en el marco de datos).

Un segundo enfoque fue hacer esto en pasos:

tmp1 <- with(dat, split(var1, strata))
tmp2 <- lapply(tmp1, qfun)
tmp3 <- unlist(tmp2)
dat$quintiles <- tmp3

Nuevamente, esto calcula los cuantiles correctamente para cada nivel de factor, pero obviamente, como conaggregate no están en el orden correcto en el marco de datos. Podemos verificar esto colocando las "bandejas" de cuantiles en el marco de datos.

# get quantile bins
qfun2 <- function(x, q = 5) {
    quantile <- cut(x, breaks = quantile(x, probs = 0:q/q), 
        include.lowest = TRUE)
    quantile
}

tmp11 <- with(dat, split(var1, strata))
tmp22 <- lapply(tmp11, qfun2)
tmp33 <- unlist(tmp22)
dat$quintiles2 <- tmp33

Muchos de los valores devar1 están fuera de los contenedores dequantile2. Siento que me estoy perdiendo algo simple. Cualquier sugerencia sería muy apreciada.

Respuestas a la pregunta(2)

Su respuesta a la pregunta