关于如何计算一列数据的分位数有很多建议,但我正在尝试根据其他字段标记每个数据点所属的分位数。
一个非常简单的例子:
pink<-data.frame(matrix(rnorm(20),nrow=100))
pink$color<-c("pink")
red<-data.frame(matrix(rnorm(50),nrow=100))
red$color<-c("red")
names(red)[names(red)=="matrix.rnorm.50...nrow...100."]<-"value"
names(pink)[names(pink)=="matrix.rnorm.20...nrow...100."]<-"value"
mydata<-rbind(red,pink)
所以想象我拥有的是mydata数据框。我想要一个新列,根据$ color的$值将每一行分配给一个分位数。在上面的例子中,一个值为0.7的行将在粉红色的前四分位数中,但不会是红色。
我如何做这种“按组/因子进行分位数”?谢谢你的帮助!
答案 0 :(得分:1)
包含data.table
包的解决方案:
require(data.table)
dt<-as.data.table(mydata)
dt[,list(value,color,findInterval(value,quantile(value,c(.25,.50,.75)))),by=color]
答案 1 :(得分:1)
您可以使用cut
获取quantile
值,并为其添加标签
newData <- lapply(split(mydata, mydata$color), function(x) {
x$key <- with(x, cut(value, quantile(value),
labels = 1:4, include.lowest = TRUE))
x
})
lapply(newData, head)
# $pink
# value color key
# 101 -1.10353351 pink 1
# 102 0.90278706 pink 4
# 103 0.06831835 pink 3
# 104 -1.14946795 pink 1
# 105 -0.90127498 pink 2
# 106 -1.19845352 pink 1
#
# $red
# value color key
# 1 -0.04827783 red 3
# 2 0.28444148 red 3
# 3 -2.34491308 red 1
# 4 0.35213987 red 4
# 5 -0.73670929 red 2
# 6 0.15286555 red 3
然后do.call(rbind, newData)
将两人重新组合在一起。
答案 2 :(得分:0)
尝试ave功能:
> mydata$block= with(mydata, ave(value, color,
FUN=function(x)findInterval(x,quantile(x,c(.25,.50,.75))) ))
> head(mydata)
value color block
1 1.6147642 red 3
2 -0.2315269 red 2
3 -0.6822261 red 1
4 -0.6143924 red 1
5 1.5840925 red 3
6 -0.8477495 red 0