gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:45:16 24 4
gpt4 key购买 nike

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

假设我有这样的数据

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com