我在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))
答案 0 :(得分:1)
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。
话虽如此,让我们假设你有一个非常强大的理由来证明你的选择。
您必须先将旧值调整为新值,然后将旧值更改为新值。如果您使用mapvalues()
包中的plyr
,则无需手动处理为您的因素添加级别等:
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)