【问题标题】:Grouped ranking in RR中的分组排名
【发布时间】:2015-10-21 07:40:39
【问题描述】:

我有一个具有如下主键和比率值的数据

2.243164164
1.429242413
2.119270714
3.013427143
1.208634972
1.208634972
1.23657632
2.212136028
2.168583297
2.151961216
1.159886063
1.234106444
1.694206176
1.401425329
5.210125578
1.215267806
1.089189869

我想添加一个排名列,将这些比率分组到 3 个箱中。类似sas代码的功能:

PROC RANK DATA = TAB1 GROUPS = &NUM_BINS

【问题讨论】:

  • 我们可以使用?cut并指定breaks=3
  • 预期的输出是什么?
  • 是的@akrun 解决方案很棒:试试data.frame(Value=values,Bin=as.integer(cut(values,breaks=3)))
  • 我试过剪切。但是,箱中的观察数量不相等。预期的输出将是宾1(1.089189869 1.159886063 1.208634972 1.208634972 1.215267806 1.234106444)宾2(1.23657632 1.401425329 1.429242413 1.694206176 2.119270714 2.151961216)BIN3(2.168583297 2.212136028 2.243164164 3.013427143 5.210125578)基本上排序,并在仓具有相等数目的观测分组跨度>

标签: r


【解决方案1】:

我做了以下事情: 将您的向量转换为数据框。 创建变量排名:

test2$rank<-rank(test2$test)
> test2
   test    rank
1  2.243164 15.0
2  1.429242  9.0
3  2.119271 11.0
4  3.013427 16.0
5  1.208635  3.5
6  1.208635  3.5
7  1.236576  7.0
8  2.212136 14.0
9  2.168583 13.0
10 2.151961 12.0
11 1.159886  2.0
12 1.234106  6.0
13 1.694206 10.0
14 1.401425  8.0
15 5.210126 17.0
16 1.215268  5.0
17 1.089190  1.0

定义函数以转换为百分位数,然后将 pr 定义为该百分位数。

percent.rank<-function(x) trunc(rank(x)/length(x)*100)
test3<-within(test2,pr<-percent.rank(rank))

然后我根据您想要其中 3 个的事实创建了垃圾箱。

test3$bins <- cut(test3$pr, breaks=c(0,33,66,100), labels=c("0-33","34-66","66-100"))

       test    x rank  pr   bins
1  2.243164 15.0 15.0  88 66-100
2  1.429242  9.0  9.0  52  34-66
3  2.119271 11.0 11.0  64  34-66
4  3.013427 16.0 16.0  94 66-100
5  1.208635  3.5  3.5  20   0-33
6  1.208635  3.5  3.5  20   0-33
7  1.236576  7.0  7.0  41  34-66
8  2.212136 14.0 14.0  82 66-100
9  2.168583 13.0 13.0  76 66-100
10 2.151961 12.0 12.0  70 66-100
11 1.159886  2.0  2.0  11   0-33
12 1.234106  6.0  6.0  35  34-66
13 1.694206 10.0 10.0  58  34-66
14 1.401425  8.0  8.0  47  34-66
15 5.210126 17.0 17.0 100 66-100
16 1.215268  5.0  5.0  29   0-33
17 1.089190  1.0  1.0   5   0-33

这对你有用吗?

【讨论】:

    【解决方案2】:

    几乎迟到了,但鉴于您的数据,我们可以使用来自 dplyr 包的 ntile 来获得相同大小的组:

    df <- data.frame(values = c(2.243164164,
                       1.429242413,
                       2.119270714,
                       3.013427143,
                       1.208634972,
                       1.208634972,
                       1.23657632,
                       2.212136028,
                       2.168583297,
                       2.151961216,
                       1.159886063,
                       1.234106444,
                       1.694206176,
                       1.401425329,
                       5.210125578,
                       1.215267806,
                       1.089189869))
    library(dplyr)
    
    df <- df %>%
      arrange(values) %>%
      mutate(rank = ntile(values, 3))
        
        
         values rank
    1  1.089190    1
    2  1.159886    1
    3  1.208635    1
    4  1.208635    1
    5  1.215268    1
    6  1.234106    1
    7  1.236576    2
    8  1.401425    2
    9  1.429242    2
    10 1.694206    2
    11 2.119271    2
    12 2.151961    2
    13 2.168583    3
    14 2.212136    3
    15 2.243164    3
    16 3.013427    3
    17 5.210126    3
    

    或从ggplot2 包中查看cut_number

    library(ggplot2)
    df$rank2 <- cut_number(df$values, 3, labels = c(1:3))
    
         values rank rank2
    1  1.089190    1     1
    2  1.159886    1     1
    3  1.208635    1     1
    4  1.208635    1     1
    5  1.215268    1     1
    6  1.234106    1     1
    7  1.236576    2     2
    8  1.401425    2     2
    9  1.429242    2     2
    10 1.694206    2     2
    11 2.119271    2     2
    12 2.151961    2     3
    13 2.168583    3     3
    14 2.212136    3     3
    15 2.243164    3     3
    16 3.013427    3     3
    17 5.210126    3     3
    

    因为您的样本包含 17 个数字,所以一个 bin 包含 5 个数字,而其他 bin 包含 6 个数字。第 12 行有所不同:ntile 将 6 个数字分配给第一组和第二组,而 cut_number 将它们分配给第一组和第三组。

    > table(df$rank)
    1 2 3 
    6 6 5 
    
    > table(df$rank2)
    1 2 3 
    6 5 6 
    

    参见此处:Splitting a continuous variable into equal sized groups

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2015-10-29
      • 2022-06-14
      • 2013-01-17
      相关资源
      最近更新 更多