R语言提取数据框唯一行:保留列高频值 频次平局按自定义层级取值
R实现分组折叠并提取带自定义平局优先级的众数
实现逻辑
核心是自定义支持优先级规则的众数计算函数,处理逻辑如下:
- 按
Set列分组,统计每组内Values各取值的出现频次 - 筛选出频次最高的所有候选值(即并列众数)
- 平局场景下,按照用户预先定义的优先级顺序,从候选值中选择优先级最高的作为最终返回值
- 每个分组最终仅输出1行结果
代码实现
首先定义通用的带优先级众数计算函数:
# 自定义众数函数 # 参数x: 待统计的数值/字符向量 # 参数priority: 自定义优先级向量,向量中位置越靠前的值优先级越高 mode_with_priority <- function(x, priority) { # 统计各取值频次 freq_count <- table(x) # 提取最高频次对应的所有并列候选值 max_freq <- max(freq_count) candidates <- as(names(freq_count[freq_count == max_freq]), class(x)) # 按优先级排序后取最高优先级值 candidates[order(match(candidates, priority))][1] }
调用示例
使用提供的测试数据演示,测试数据中B组的1、2各出现2次,属于频次平局场景:
# 加载dplyr用于分组聚合,无该包可运行install.packages("dplyr")安装 library(dplyr) # 测试数据 df <- data.frame(Set = c("A","A","A","B","B","B","B"), Values=c(1,1,2,1,1,2,2)) # 自定义优先级规则1:平局时1的优先级高于2 rule1 <- c(1, 2) result1 <- df %>% group_by(Set) %>% summarise(Values = mode_with_priority(Values, rule1), .groups = "drop") # 自定义优先级规则2:平局时2的优先级高于1 rule2 <- c(2, 1) result2 <- df %>% group_by(Set) %>% summarise(Values = mode_with_priority(Values, rule2), .groups = "drop")
结果说明
- A组中1出现2次、2出现1次,无平局,两种规则下返回值均为1
- B组触发平局规则,
result1中B组返回1,result2中B组返回2
如果不想依赖dplyr,也可以用base R的aggregate函数实现相同效果:
# base R 版本调用(以rule2为例) result_base <- aggregate(Values ~ Set, data = df, FUN = function(x) mode_with_priority(x, rule2))
注意事项
- 自定义的优先级向量需要覆盖
Values列所有可能出现的取值,避免返回NA - 优先级顺序完全自定义,不需要和取值的大小顺序绑定,可根据业务需求任意调整顺序
内容的提问来源于stack exchange,提问作者pfadenhw
相关产品推荐
相关产品推荐

