gpt4 book ai didi

R,根据某一列的排名选择行

转载 作者:行者123 更新时间:2023-12-01 22:57:15 26 4
gpt4 key购买 nike

我有一个像下面这样的 R 数据框,

name score
marry 98
marry 77
marry 87
marry 96
mark 99
mark 44
mark 79
john 87
john 77

对于每个名称,我想选择得分最高的 2 行,这应该是,
name score
marry 98
marry 96
mark 99
mark 79
john 87
john 77

有人可以帮忙吗?
非常感谢!

最佳答案

这是一种可能的基本方法:

mydf[with(mydf, ave(-score, name, FUN = order)) %in% c(1, 2), ]
# name score
# 1 marry 98
# 4 marry 96
# 5 mark 99
# 7 mark 79
# 8 john 87
# 9 john 77

对于好奇的人,关于时间——这是一个小测试......

两个样本数据集,均为 100 万行,两列,但一个只有 1000 个可能的“名称”值,另一个有 10000 个可能的值。
set.seed(1)
df1 <- data.frame(
name = sample(1000, 1000000, TRUE),
score = sample(0:100, 1000000, TRUE)
)
df2 <- data.frame(
name = sample(10000, 1000000, TRUE),
score = sample(0:100, 1000000, TRUE)
)

进行基准测试的功能——稍后我会在重新安装它后尝试添加“dplyr”。
fun1 <- function(mydf) {
mydf[with(mydf, ave(-score, name, FUN = order)) %in% c(1, 2), ]
}

fun2 <- function(mydf) {
as.data.table(mydf)[order(-score), .SD[1:2], by=name]
}

fun3 <- function(mydf) {
df <- as.data.table(mydf)
setorder(df, -score)[, head(.SD, 2), by = name]
}

基准测试。
library(microbenchmark)
microbenchmark(fun1(df1), fun2(df1), fun3(df1),
fun1(df2), fun2(df2), fun3(df2), times = 20)
# Unit: milliseconds
# expr min lq mean median uq max neval
# fun1(df1) 502.76809 513.98317 569.47883 597.90488 603.34458 686.4302 20
# fun2(df1) 733.12544 741.18777 796.67106 822.60824 828.88449 839.3837 20
# fun3(df1) 87.80581 93.07012 95.34281 95.56374 97.49608 101.7991 20
# fun1(df2) 672.60241 764.10237 764.60365 772.33959 780.14679 799.3505 20
# fun2(df2) 6338.14881 6360.42621 6407.66675 6412.99278 6451.75626 6479.2681 20
# fun3(df2) 354.24119 366.47396 382.58666 369.78597 374.01897 468.9197 20

关于R,根据某一列的排名选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26442440/

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