R 中的分位数在下分位数的上限和上分位数的下限之间增加 0.01

quantiles in R using with an increase of 0.01 between the upper limit of the lower quantile and lower limit of the upper quantile

我在 R 中有以下代码来为我的数据帧生成五分位数。然而,使用它生成的五分位数是 - “[0.22,4.16]” “(4.16,7.15]” “(7.15,9.7]” “(9.7,19​​.2]” “(19.2,78.4]”.

相反,我希望水平在前一个五分位数的上限和下一个五分位数的下限之间增加 0.01。所以我希望他们是 - “[0.22,4.16]” “(4.17,7.15]” “(7.16,9.7]” “(9.8,19.2]” “(19.3,78.4]”.

任何帮助将不胜感激

library(dplyr)
library(gtools)

mydata <-mydata%>%
mutate(Value = ifelse(Value == -1,NA,Value),
Value = quantcut(Value, q=seq(0,1,by=0.2), na.rm=TRUE))

quantcut() 为您提供 [0.22, 4.16](4.16,7.15](7.15,9.7](9.7,19.2](19.2,78.4]所有 范围内的可能值都通过这种将间隔切割成五分位数的方式涵盖。

您想要:[0.22, 4.16](4.17,7.15](7.16,9.7](9.71,19.2](19.21,78.4]。这无法解释所有高于五分位数边界 0.1 的值。像这样,数字 4.17 不属于第一个区间,它也被排除在第二个区间之外,因为所有区间的左边界都是开放的。这同样适用于 7.16、9.71 和 19.21。

话虽如此,让我们假设您有非常充分的理由来证明您的选择是正确的。

您必须先将旧值调整为新值,然后再将旧值更改为新值。如果你为此使用 plyr 包中的 mapvalues(),你将不必手动为你的因素添加级别等:

library(plyr)
mydata$quants <- quantcut(mydata$Value, q = seq(0, 1, by=0.2), na.rm=TRUE)

# Step 1: Adapt old values to new values with regular expressions:
old_vals <- levels(mydata$quants)[-1]

regs <- gregexpr("(?<=\()(.*)(?=,)", levels(mydata$quants), perl=TRUE)
repl <- as.numeric(regmatches(levels(mydata$quants), regs))[-1] + 0.1

new_vals <- mapply(gsub, replacement=repl, x=old_vals, 
              MoreArgs = list(pattern = "(?<=\()(.*)(?=,)", perl=TRUE))

# Step 2:
mydata$quants <- mapvalues(mydata$quants, from=old_vals, to=new_vals)