r - 在 R 中创建等级变量的有效方法

标签 r dataframe rank

我想在我的数据框中创建几个排名变量。首先,我想要最好的排名方式。

假设我有这样的数据

grp<-c("sw","sw","sw","sl","sl","sl","sw","sl")
val<-c(12,2,6,4,9,15,6,4)
df<-cbind.data.frame(grp,val)

我希望对数据进行排名,以便在排名中没有中断,但平分。所以像这样:(我使用以下方法对数据进行排序:df[order(df$val),] )

  grp val rk
2  sw   2  1
4  sl   4  2.5
8  sl   4  2.5
3  sw   6  3.5
7  sw   6  3.5
5  sl   9  4
1  sw  12  5
6  sl  15  6

我知道如何让顺序不中断(通过使用 dense_rank)以及如何获得平局(使用排名),但不知道如何同时获得两者。密集排名似乎没有任何参数可以让您指定如何处理平局。

如果可能的话,我想要一些可以轻松应用于多列的东西。

最佳答案

在预先排序的数据基础上:

with(df, ave(cumsum(!duplicated(val)) , val, FUN = function(x) x + (length(x) > 1)/length(x)))

[1] 1.000000 2.333333 2.333333 2.333333 3.500000 3.500000 4.000000 5.000000 6.000000

或者使用 dplyr 同样的想法:

library(dplyr)

df %>%
  mutate(rk = dense_rank(val)) %>%
  group_by(val) %>%
  mutate(rk = rk + (n() > 1) / n())

# A tibble: 9 x 3
# Groups:   val [6]
  grp     val    rk
  <chr> <int> <dbl>
1 sw        2  1   
2 sl        4  2.33
3 sl        4  2.33
4 sl        4  2.33
5 sw        6  3.5 
6 sw        6  3.5 
7 sl        9  4   
8 sw       12  5   
9 sl       15  6 

数据(略有改动以添加多个副本):

df <- structure(list(grp = c("sw", "sl", "sl", "sl", "sw", "sw", "sl", 
                             "sw", "sl"), val = c(2L, 4L, 4L, 4L, 6L, 6L, 9L, 12L, 15L), rk = c(1, 
                                                                                                2.5, 2.5, 2.5, 3.5, 3.5, 4, 5, 6)), class = "data.frame", row.names = c("2", 
                                                                                                                                                                        "4", "9", "8", "3", "7", "5", "1", "6"))

关于r - 在 R 中创建等级变量的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61679120/

相关文章:

python - Pandas:如何从每行的一个单词重建字符串

r - 按行获取 x 值之间的平均列数

r - SE filter_ by 函数采用多列

r - 根据 R 中的交叉验证(训练)数据绘制 ROC 曲线

python - pandas中大数据集的数据准备

r - 如何在使用 R 保持原始行顺序的同时按行提取唯一记录和双记录?

sql - 如何对数据集进行密集排名

apache-spark - 高效计算spark中的top-k元素

pandas - 在 pandas DataFrame 的滚动窗口上对数据进行排名

r - dplyr Pipes - 如何更改原始数据框