我有一个数据框,我正在尝试在数据框中创建一个新变量,该变量具有连续变量的分位数var1
,用于因子的每个级别strata
。
# 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
}
我尝试使用两种方法,但都没有产生可用的结果。首先,我尝试使用aggregate
应用于qfun
每个级别strata
:
qdat <- with(dat, aggregate(var1, list(strata), FUN = qfun))
这会按因子级别返回分位数,但很难将输出强制返回到数据框中(例如,使用unlist
不会将新变量值与数据框中的正确行对齐)。
第二种方法是分步进行:
tmp1 <- with(dat, split(var1, strata))
tmp2 <- lapply(tmp1, qfun)
tmp3 <- unlist(tmp2)
dat$quintiles <- tmp3
同样,这会正确计算每个因子级别的分位数,但显然,aggregate
它们在数据框中的顺序不正确。我们可以通过将分位数“箱”放入数据框中来检查这一点。
# 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
的许多值var1
在 的箱之外quantile2
。我觉得我错过了一些简单的东西。任何建议将不胜感激。