在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
相关产品推荐
相关产品推荐

