【问题标题】:r bin equal decilesr bin 等于十分位数
【发布时间】:2016-10-06 11:52:05
【问题描述】:

我有一个包含 6,000 多个观察值的数据集,每条记录的得分范围为 0-100。下面是一个示例:

+-----+-------+
| uID | score |
+-----+-------+
|   1 |    77 |
|   2 |    61 |
|   3 |    74 |
|   4 |    47 |
|   5 |    65 |
|   6 |    51 |
|   7 |    25 |
|   8 |    64 |
|   9 |    69 |
|  10 |    52 |
+-----+-------+

我想根据他们在分数列中相对于同龄人的排名顺序将它们分成相等的十分位数,截止值在每 10 个百分位,如下所示:

+-----+-------+-----------+----------+
| uID | score | position% | scoreBin |
+-----+-------+-----------+----------+
|   7 |    25 | 0.1       |        1 |
|   4 |    47 | 0.2       |        2 |
|   6 |    51 | 0.3       |        3 |
|  10 |    52 | 0.4       |        4 |
|   2 |    61 | 0.5       |        5 |
|   8 |    64 | 0.6       |        6 |
|   5 |    65 | 0.7       |        7 |
|   9 |    69 | 0.8       |        8 |
|   3 |    74 | 0.9       |        9 |
|   1 |    77 | 1         |       10 |
+-----+-------+-----------+----------+

到目前为止,我已经尝试过 cut、cut2、tapply 等。我认为我在正确的逻辑路径上,但我不知道如何将它们应用于我的情况。非常感谢任何帮助。

【问题讨论】:

    标签: r percentile binning


    【解决方案1】:

    我会在dplyr 中使用ntile()

    library(dplyr)
    
    score<-c(77,61,74,47,65,51,25,64,69,52)
    ntile(score, 10)
    
    ##[1] 10  5  9  2  7  3  1  6  8  4
    
    scoreBin<- ntile(score, 10)
    

    【讨论】:

    • 嗯,这看似简单。非常感谢布莱恩!其他答案也很好,所以这对我来说是一个很好的参考帖子。
    【解决方案2】:

    base R 中,我们可以使用.bincode()quantile() 的组合:

    df$new <- .bincode(df$score, 
                   breaks = quantile(df$score, seq(0, 1, by = 0.1)),
                   include.lowest = TRUE)
    #   uID score new
    #1    1    77  10
    #2    2    61   5
    #3    3    74   9
    #4    4    47   2
    #5    5    65   7
    #6    6    51   3
    #7    7    25   1
    #8    8    64   6
    #9    9    69   8
    #10  10    52   4
    

    【讨论】:

      【解决方案3】:

      这是一种使用quantilecut 来获取垃圾箱的方法:

      df$scoreBin <- as.integer(cut(df$score,
                            breaks=quantile(df$score, seq(0,1, .1), include.lowest=T)))
      

      as.integer 将 cut 的输出(它是一个因子)强制转换为基础整数。

      获得排名百分比的一种方法是使用rank

      df$position <- rank(df$score) / nrow(df)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 2017-08-07
        • 2023-01-20
        • 2016-05-25
        相关资源
        最近更新 更多