Quantis por níveis de fator em R
Eu tenho um quadro de dados e estou tentando criar uma nova variável no quadro de dados que tem os quantis de uma variável contínuavar1
, para cada nível de um fatorstrata
.
# 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
}
Eu tentei usar dois métodos, nenhum dos quais produzem um resultado utilizável. Em primeiro lugar, tentei usaraggregate
aplicarqfun
para cada nível destrata
:
qdat <- with(dat, aggregate(var1, list(strata), FUN = qfun))
Isso retorna os quantis por nível de fator, mas a saída é difícil de ser forçada a retornar a um quadro de dados (por exemplo, usandounlist
não alinha os novos valores de variáveis com as linhas corretas no quadro de dados).
Uma segunda abordagem foi fazer isso em etapas:
tmp1 <- with(dat, split(var1, strata))
tmp2 <- lapply(tmp1, qfun)
tmp3 <- unlist(tmp2)
dat$quintiles <- tmp3
Novamente, isso calcula os quantis corretamente para cada nível de fator, mas obviamente,aggregate
eles não estão na ordem correta no quadro de dados. Podemos verificar isso colocando os "bins" de quantil no quadro de dados.
# 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
Muitos dos valores devar1
estão fora das caixas dequantile2
. Eu sinto que estou perdendo algo simples. Qualquer sugestão seria muito apreciada.