将条件编号应用于R中的分组数据

时间:2016-06-01 18:27:30

标签: r group-by rank

我有一个类似下面的表,有100行数据。

ID  RANK
1   2
1   3
1   3
2   4
2   8
3   3
3   3
3   3
4   6
4   7
4   7
4   7
4   7
4   7
4   6

我想尝试找到一种按ID分组数据的方法,这样我就可以单独重新安排每个组。

“ReRank”列基于“Rank”列,基本上从1开始重新编号,从最小到最大,但重要的是要注意ReRank列中的数字可以放入不止一次取决于Rank列中的数字。

换句话说,输出需要看起来像这样

ID   Rank ReRANK
1    3       2
1    2       1
1    3       2
2    4       1
2    8       2
3    3       1
3    3       1
3    3       1

对于我的生活,我无法弄清楚如何通过分组列和Rank列的值来重新整理列。

到目前为止,这是我最好的猜测,但绝对没有做我需要做的事情

ReRANK = mat.or.vec(length(RANK),1)
ReRANK[1] = counter = 1
for(i in 2:length(RANK)) {
  if (RANK[i] != RANK[i-1]) { counter = counter + 1 }
  ReRANK[i] = counter
}

提前感谢您的帮助!!

1 个答案:

答案 0 :(得分:2)

以下是使用averank的基本R方法:

df$ReRank <- ave(df$Rank, df$ID, FUN=function(i) rank(i, ties.method="min"))

等级中的最小参数确保在存在关联时将发生最小排名。默认是取等级的平均值。

如果您在组中的关系较低,rank将计算这些较低的值,然后添加继续下一个最低值作为较低值的计数+ 1.这些值仍将是有序且不同的。如果你真的想让计数分别为1,2,3等,而不是1,3,6或其他什么,这取决于重复值的数量,这里有一点点使用factor

df$ReRank <- ave(df$Rank, df$ID, FUN=function(i) {
                 as.integer(factor(rank(i, ties.method="min"))))

在这里,我们使用factor为每个级别构建从向上计数的值。然后我们强制它为整数。

例如,

temp <- c(rep(1, 3), 2,5,1,4,3,7)
[1] 2.5 2.5 2.5 5.0 8.0 2.5 7.0 6.0 9.0
rank(temp, ties.method="min")
[1] 1 1 1 5 8 1 7 6 9
as.integer(factor(rank(temp, ties.method="min")))
[1] 1 1 1 2 5 1 4 3 6

数据

df <- read.table(header=T, text="ID   Rank 
1    2       
1    3       
1    3       
2    4       
2    8       
3    3      
3    3       
3    3 ")