Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 具有相同值的排序数据_R - Fatal编程技术网

R 具有相同值的排序数据

R 具有相同值的排序数据,r,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

我有一个很大的数据集,包括一列不同遗传标记的计数。我想生成一个整体排名,考虑到计数,而不考虑遗传标记。例如,如果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
请注意,SNPs a4和a8是相同的,a5、a6和a7具有相同的计数值,a10和a11也具有相同的计数值。我试过了

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

但是它不是我想要的,我想要的是
data.table
包中的
rleid
函数

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

您要查找的是
data.table
包中的
rleid
函数

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

a4和a8在所需输出中具有相同的计数,但等级不同。。?不管怎样,这里有一些数据。table::frank和dplyr::dense_rank如果你想要排名的话可能会很有用。是的,对不起,我的错误a4和a8应该都排在第4位。如果是这样的话,你能编辑你的问题吗?我会删除我不正确的答案Emil rleid工作我所要做的就是事先对计数列排序。@Emil你可以编辑到
setDT(df)[顺序(-count),rank:=rleid(count)]
(暂时对数据进行排序,只是为了构造计数器)a4和a8的计数相同,但在所需的输出中排名不同。无论如何,有数据。table::frank和dplyr::dense_rank如果您确实想要排名,可能会很有用。是的,对不起,我的错误a4和a8都应该排名4。如果是这样,您可以编辑您的问题,我将删除我不正确的答案Emil rleid工作预先对计数列进行排序。@eml您可以编辑到
setDT(df)[order(-count),rank:=rleid(count)]
(对数据进行临时排序只是为了构造计数器)