gpt4 book ai didi

r - 多组排名使用数据表包

转载 作者:行者123 更新时间:2023-12-04 00:51:32 26 4
gpt4 key购买 nike

我有一个数据框,其中包含一个组标识符和该组对一项事件的观察得分。组字母和分数都可以重复。

library(tidyverse)
library(data.table)

set.seed(1)

dat <- data.frame(rowid = 1:1000,
grp = sample(LETTERS[1:20], 1000, replace = T),
score = sample(1:5, 1000, replace = T))

对于每个组,我需要按降序排列他们不同的分数;对于每个独特的组和分数组合,我想保留一行。理想情况下,这一行应该是具有最小 rowid 的行,但这不是绝对必要的。如果从每个组和分数组合中随机选择一行会更有效,那也同样有效。

dat %>% 
group_by(grp) %>%
mutate(score_rank = dense_rank(desc(score))) %>%
arrange(grp, score_rank, rowid) %>% ## this step not completely necessary (see above)
group_by(grp, score_rank) %>%
mutate(score_rank_row = row_number()) %>%
filter(score_rank_row == 1) %>%
arrange(grp, -score)

上面的代码完成了我想做的事情,但实际上,我的实际数据框有 2000 万多行,有 5,000 个组值,每个组可以有数百个分数,其中许多是重复的。结果,当我尝试将上面介绍的解决方案用于我的实际用例时,我的计算机一直在运行,但没有完成操作。

我的理解是 data.table 在处理这些类型的任务时效率更高,但我终究无法弄清楚使用它的语法。谁能帮帮我?

最佳答案

有了data.table,我们就可以使用

library(data.table)
setDT(dat)[, score_rank := frank(-score, ties.method = 'dense'), grp]
setkey(dat, grp, score_rank, rowid)
dat[, score_rank_row := rowid(grp, score_rank)][
score_rank_row == 1][order(grp, -score)]

关于r - 多组排名使用数据表包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66111334/

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