将条件编号应用于 R 中的分组数据
apply conditional numbering to grouped data in R
我有一个 table,如下图所示,有 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
对于我的生活,我无法弄清楚如何能够通过分组列和排名列的值对列进行重新排名。
到目前为止,这是我最好的猜测,但它绝对不是我需要它做的事情
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
}
提前感谢您的帮助!!
这是使用 ave
和 rank
的基础 R 方法:
df$ReRank <- ave(df$Rank, df$ID, FUN=function(i) rank(i, ties.method="min"))
rank 中的 min 参数确保出现平局时出现最低排名。默认是取排名的平均值。
如果您在组中有较低的关系,rank
将计算那些较低的值,然后继续添加下一个最低值作为较低值的计数 + 1。这些值将仍然是有序和独特的。如果您真的想让计数为 1、2、3 等等,而不是 1、3、6 或任何取决于重复值的数量,这里有一个使用 factor
:[=19 的小窍门=]
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 ")
我有一个 table,如下图所示,有 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
对于我的生活,我无法弄清楚如何能够通过分组列和排名列的值对列进行重新排名。
到目前为止,这是我最好的猜测,但它绝对不是我需要它做的事情
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
}
提前感谢您的帮助!!
这是使用 ave
和 rank
的基础 R 方法:
df$ReRank <- ave(df$Rank, df$ID, FUN=function(i) rank(i, ties.method="min"))
rank 中的 min 参数确保出现平局时出现最低排名。默认是取排名的平均值。
如果您在组中有较低的关系,rank
将计算那些较低的值,然后继续添加下一个最低值作为较低值的计数 + 1。这些值将仍然是有序和独特的。如果您真的想让计数为 1、2、3 等等,而不是 1、3、6 或任何取决于重复值的数量,这里有一个使用 factor
:[=19 的小窍门=]
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 ")