我有一个很大的数据集,其中包括一列针对不同遗传标记的计数。我想生成一个综合排名,其中要考虑计数数,而不考虑遗传标记。例如,如果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)))
但我不想要
答案 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