在R中,如何为不同因子分配分位数?

时间:2014-10-02 21:07:39

标签: r factors quantile

关于如何计算一列数据的分位数有很多建议,但我正在尝试根据其他字段标记每个数据点所属的分位数。

一个非常简单的例子:

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的行将在粉红色的前四分位数中,但不会是红色。

我如何做这种“按组/因子进行分位数”?谢谢你的帮助!

3 个答案:

答案 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