计算每个组的排名,但计算平局为1

问题描述 投票:1回答:1

跟随这篇文章:Calculate ranks for each group

df <- ddply(df, .(type), transform, pos = rank(x, ties.method = "min")-1)

使用上面文章中描述的方法,当你在同一个TYPE上有多个关系时,排名输出(Pos)有点乱,难以解释,虽然技术上仍然是准确的输出。

例如:

library(plyr)
df <- data.frame(type = c(rep("a",11), rep("b",6), rep("c",2), rep("d", 6)), 
                    x = c(50:53, rep(54, 3), 55:56, rep(57, 2), rep(51,3), rep(52,2), 56,
                          53, 57, rep(52, 2), 54, rep(58, 2), 70))
df<-ddply(df,.(type),transform, pos=rank(x,ties.method="min")-1)

生产:

Type    X    Pos
a       50   0
a       51   1
a       52   2
a       53   3
a       54   4
a       54   4
a       54   4
a       55   7
a       56   8
a       57   9
a       57   9
b       51   0
b       51   0
b       51   0
b       52   3
b       52   3
b       56   5
c       53   0
c       57   1
d       52   0
d       52   0
d       54   2
d       58   3
d       58   3
d       70   5

Pos相对排名是正确的(相等的值排名相同,较低的值排名较低,较高的值排名较高),但我一直在努力使输出看起来更漂亮。有什么想法吗?

我想让输出看起来像这样:

Type    X    Pos
a       50   1
a       51   2
a       52   3
a       53   4
a       54   5
a       54   5
a       54   5
a       55   6
a       56   7
a       57   8
a       57   8
b       51   1
b       51   1
b       51   1
b       52   2
b       52   2
b       56   3
c       53   1
c       57   2
d       52   1
d       52   1
d       54   2
d       58   3
d       58   3
d       70   4

当然,这种格式假定每个组的记录总数无关紧要。通过取消“-1”,我们可以删除0,但这只能解决一个方面。我试过玩不同的方程和关系。方法,但无济于事。

也许rank()函数不是我应该使用的?

r plyr rank
1个回答
0
投票

看来你正在寻找密集级别:

as.data.table(df)[, pos := frank(x, ties.method = 'dense'), by = 'type'][]
#     type  x pos
# 1:    a 50   1
# 2:    a 51   2
# 3:    a 52   3
# 4:    a 53   4
# 5:    a 54   5
# 6:    a 54   5
# 7:    a 54   5
# 8:    a 55   6
# 9:    a 56   7
# 10:    a 57   8
# 11:    a 57   8
# 12:    b 51   1
# 13:    b 51   1
# 14:    b 51   1
# 15:    b 52   2
# 16:    b 52   2
# 17:    b 56   3
# 18:    c 53   1
# 19:    c 57   2
# 20:    d 52   1
# 21:    d 52   1
# 22:    d 54   2
# 23:    d 58   3
# 24:    d 58   3
# 25:    d 70   4
# type  x pos

dens_rankdplyr做同样的事情:

library(dplyr)
df %>% group_by(type) %>% mutate(pos = dense_rank(x)) %>% ungroup()
# # A tibble: 25 x 3
#      type     x   pos
#    <fctr> <dbl> <int>
#  1      a    50     1
#  2      a    51     2
#  3      a    52     3
#  4      a    53     4
#  5      a    54     5
#  6      a    54     5
#  7      a    54     5
#  8      a    55     6
#  9      a    56     7
# 10      a    57     8
# # ... with 15 more rows
© www.soinside.com 2019 - 2024. All rights reserved.