R 具有相同值的排序数据
我有一个很大的数据集,包括一列不同遗传标记的计数。我想生成一个整体排名,考虑到计数,而不考虑遗传标记。例如,如果2个或更多的遗传标记的计数都是5,那么它们都应该具有相同的秩数,我希望秩数显示在单独的列中。我有这个数据框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
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)]
(对数据进行临时排序只是为了构造计数器)