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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:03:22