Kwantyle według poziomów czynników w R

Mam ramkę danych i próbuję utworzyć nową zmienną w ramce danych, która ma kwantyle zmiennej ciągłejvar1, dla każdego poziomu czynnikastrata.

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

Próbowałem użyć dwóch metod, z których żadna nie daje użytecznego wyniku. Po pierwsze, próbowałem użyćaggregate aplikowaćqfun do każdego poziomustrata:

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

Zwraca to kwantyle według poziomu współczynnika, ale dane wyjściowe są trudne do przywrócenia z powrotem do ramki danych (np. Przy użyciuunlist nie wyrównuje wartości nowej zmiennej z poprawnymi wierszami w ramce danych).

Drugim podejściem było wykonanie tego kroku:

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

Ponownie oblicza to kwantyle poprawnie dla każdego poziomu czynnika, ale oczywiście, tak jak w przypadkuaggregate nie są w odpowiedniej kolejności w ramce danych. Możemy to sprawdzić, umieszczając kwantyle „pojemniki” w ramce danych.

# 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

Wiele wartościvar1 są poza pojemnikamiquantile2. Czuję, że brakuje mi czegoś prostego. Wszelkie sugestie byłyby bardzo mile widziane.

questionAnswers(2)

yourAnswerToTheQuestion