【问题标题】:how to get the indices of values by the quantile?如何通过分位数获取值的索引?
【发布时间】:2013-12-05 09:55:21
【问题描述】:

例如,如果我的数据如下所示:

> a <- c(1:25)
> a
[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

我如何获得这样的列表:

1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 

所以我想把这25个元素分成5个子列表,找出每个元素所属的子列表的索引。数据未排序并且太大而无法排序。还有缺失值,在这种情况下,它们的索引将为 0。

抱歉,澄清一下,我不需要组的大小相等,但它们需要除以 0.2、0.4、0.6、0.8 分位数。

即我输出中的第 i 个元素应该是 a 中第 i 个元素所属的第 n 个分位数。例如,8 在第二个分位数中,我输出中的第 8 个元素是 2。

【问题讨论】:

  • 或许使用findIntervalquantile
  • 我认为如果不先对数据进行排序,您将无法做到这一点
  • 响应您的第 n 次编辑:如果您想除以 0.2、0.4 等分位数,那么根据定义,您确实需要大小相等的组。

标签: r list vector quantile


【解决方案1】:

也许:

 acut <- cut(a, 
             quantile(a, probs=c(0, 0.2, 0.4, 0.6, 0.8, 1) ) , 
             include.lowest=TRUE)

 as.numeric(acut) 

【讨论】:

  • 您也可以在cut(...) 的末尾加上,labels=1:5 以避免必须as.numeric 结果。
  • 嗯,它们可能看起来像数字,但它们会是因素,谁知道这可能会导致什么问题。
【解决方案2】:
# random data with 3 NAs
> a<-sample(c(NA,NA,NA,sample(1:1000,25)))
> a
 [1] 414 744 897 777  20 371 625 462 341 766  NA 243  NA 213 198 691  NA 325 275 526 830 179  40 601  51 725  68 709
> b<-ceiling(rank(a,na.last="keep")/length(which(!is.na(a)))*5)
> b[is.na(b)]=0
> b
 [1]  3  5  5  5  1  3  4  3  3  5 NA  2 NA  2  2  4 NA  2  2  3  5  1  1  4  1  4  1  4
# check that all groups have the same size
> table(b)
b
1 2 3 4 5 
5 5 5 5 5

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 2011-04-10
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多