gpt4 book ai didi

r - R中因子水平的分位数

转载 作者:行者123 更新时间:2023-12-04 10:13:16 24 4
gpt4 key购买 nike

我有一个数据框,我试图在数据框中创建一个新变量,该变量具有连续变量的分位数 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 一样。它们在数据框中的顺序不正确。我们可以通过将分位数“bins”放入数据框中来检查这一点。
# 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 的 bin 之外.我觉得我错过了一些简单的东西。任何建议将不胜感激。

最佳答案

我认为你的问题是你真的不想聚合,而是使用 ave ,(或 data.tableplyr)

qdat <- transform(dat, qq = ave(var1, strata, FUN = qfun))

#using plyr
library(plyr)

qdat <- ddply(dat, .(strata), mutate, qq = qfun(var1))

#using data.table (my preference)


dat[, qq := qfun(var1), by = strata]

聚合通常意味着返回一个小于原始对象的对象。 (在这种情况下,您将获得一个 data.frame,其中 x 是每个层的 1 个元素的 list

关于r - R中因子水平的分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15561976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com