对具有相同值的数据进行排名

时间:2018-07-30 20:25:08

标签: r

我有一个很大的数据集,其中包括一列针对不同遗传标记的计数。我想生成一个综合排名,其中要考虑计数数,而不考虑遗传标记。例如,如果2个或更多的遗传标记均具有5个计数,则它们都应具有相同的等级编号,而我希望等级编号显示在单独的列中。我有这个数据框;

SNP    count
a1      26
a2      18
a3      16
a4      15
a5      14
a6      14
a7      14
a8      15
a9      13
a10     12
a11     12
a12     11
a13     10
a14     9
a15     8

我希望输出为:

SNP    count   rank
a1      26    1
a2      18    2
a3      16    3
a4      15    4
a8      15    4
a5      14    5
a6      14    5
a7      14    5
a9      13    7
a10     12    8
a11     12    8
a12     11    9
a13     10    10
a14     9     11
a15     8     12

请注意,SNP a4和a8相同,a5,a6,a7具有相等的计数值,a10和a11也相同。我尝试过

 transform(df, x= ave(count,FUN=function(x) order(x,decreasing=T)))

但我不想要

1 个答案:

答案 0 :(得分:2)

您正在寻找的是rleid软件包中的data.table函数。

data.table::rleid(df$count)
[1]  1  2  3  4  5  5  5  6  7  8  8  9 10 11 12

df的获取方式如下:

df <- read.table(text ="SNP    count
a1      26
                 a2      18
                 a3      16
                 a4      15
                 a5      14
                 a6      14
                 a7      14
                 a8      15
                 a9      13
                 a10     12
                 a11     12
                 a12     11
                 a13     10
                 a14     9
                 a15     8", 
                 stringsAsFactors =FALSE, 
                 header = TRUE)

为了彻底:

df$rank <- data.table::rleid(df$count)

df
   SNP count rank
1   a1    26    1
2   a2    18    2
3   a3    16    3
4   a4    15    4
5   a5    14    5
6   a6    14    5
7   a7    14    5
8   a8    15    6
9   a9    13    7
10 a10    12    8
11 a11    12    8
12 a12    11    9
13 a13    10   10
14 a14     9   11
15 a15     8   12

编辑:

由于@Frank,更好的解决方案是在应用rleid之前按计数对数据帧进行排序:

setDT(df)[order(-count), rank := rleid(count)]

哪个给:

df
     SNP count rank
  1:  a1    26    1
  2:  a2    18    2
  3:  a3    16    3
  4:  a4    15    4
  5:  a5    14    5
  6:  a6    14    5
  7:  a7    14    5
  8:  a8    15    4
  9:  a9    13    6
 10: a10    12    7
 11: a11    12    7
 12: a12    11    8
 13: a13    10    9
 14: a14     9   10
 15: a15     8   11