You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中按provider筛选保留学生数最多行,并列时仅留一行

解决方法

下面提供几种在R中实现需求的常用方式,注意你的代码里数据集列名为provider_id_num,和表格示例里的provider_id存在笔误,以下方案均以代码定义的列名为准:

方法一:Base R 原生实现

用ave()函数分组计算每组学生数的最大值,先筛选出所有符合最大值条件的行,再通过去重保留每组的第一行:

# 筛选每个provider下学生数等于组内最大值的行
max_candidates <- data[ave(data$number_students, data$provider_id_num, FUN = max) == data$number_students, ]
# 每组仅保留第一行
result_base <- max_candidates[!duplicated(max_candidates$provider_id_num), ]
print(result_base)

方法二:dplyr(tidyverse)实现

这是更简洁直观的写法,适合习惯tidy风格的用户:

library(dplyr)

# 方式1:先筛选最大值行再取每组第一行
result_dplyr <- data %>%
  group_by(provider_id_num) %>%
  filter(number_students == max(number_students)) %>%
  slice_head(n = 1) %>%
  ungroup()

print(result_dplyr)

# 方式2:用slice_max一步到位
result_dplyr2 <- data %>%
  group_by(provider_id_num) %>%
  slice_max(order_by = number_students, n = 1, with_ties = FALSE) %>%
  ungroup()

print(result_dplyr2)

其中slice_max()的with_ties = FALSE参数会自动忽略并列的最大值行,直接保留每组第一行。

方法三:data.table 实现

如果你的数据集规模较大,data.table的运行效率会更高:

library(data.table)

dt <- as.data.table(data)
result_dt <- dt[, .SD[number_students == max(number_students)][1], by = provider_id_num]
print(result_dt)

以上任意一种方法都能满足需求:每个provider保留学生数最多的一行,并列最大值的情况自动保留任意一行(默认取每组的第一行)。

内容的提问来源于stack exchange,提问作者fe108

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:10:11