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

R语言:如何保留分组内出现次数最多的ID对应的行?

解决R中按分组保留出现次数最多ID的所有行问题

首先得先修正你提供的原始数据框代码,原来的写法会导致列名混乱,正确的构建方式应该是这样的:

df <- read.table(text = "id value name
1 100 Rank1
2 100 Rank1
3 100 Rank1
4 355 Rank1
5 300 Rank2
6 400 Rank2
7 400 Rank2", stringsAsFactors = FALSE, header = TRUE)

接下来针对你的需求——按name分组,保留每个分组中出现次数最多的value(你描述里的“id”其实对应这里的value列)的所有行,我给你推荐几种适配大型数据集的实现方法:

方法一:使用dplyr包(可读性高,适合大多数场景)

dplyr的语法清晰易懂,处理中等规模到大型数据集都很高效:

library(dplyr)

# 按name和value分组统计次数,再筛选每个name组中次数最多的行
result_df <- df %>%
  # 先统计每个(name, value)组合的出现次数
  group_by(name, value) %>%
  mutate(count = n()) %>%
  # 回到按name分组,筛选出次数等于该组最大值的行
  group_by(name) %>%
  filter(count == max(count)) %>%
  # 移除临时统计的count列,取消分组
  select(-count) %>%
  ungroup()

# 查看结果
print(result_df)

运行后会得到你想要的结果:

# A tibble: 5 × 3
     id value name  
  <int> <int> <chr> 
1     1   100 Rank1 
2     2   100 Rank1 
3     3   100 Rank1 
4     6   400 Rank2 
5     7   400 Rank2 

方法二:使用data.table包(极致高效,超大型数据集首选)

如果你的数据集非常庞大(百万级以上行),data.table的速度优势会非常明显,它的内存使用也更高效:

library(data.table)

# 将普通数据框转为data.table
setDT(df)

# 一步完成统计和筛选
result_df <- df[, count := .N, by = .(name, value)][, .SD[count == max(count)], by = name][, count := NULL]

# 查看结果
print(result_df)

方法三:Base R实现(无需加载任何包)

如果你不想依赖第三方包,也可以用Base R的方法实现,虽然效率不如前两种,但胜在无依赖:

# 统计每个(name, value)组合的出现次数
count_table <- table(df$name, df$value)

# 找出每个name组中出现次数最多的value
max_values <- apply(count_table, 1, function(x) names(x)[x == max(x)])

# 将结果转换为匹配用的数据框
max_df <- stack(max_values)
colnames(max_df) <- c("value", "name")
max_df$value <- as.integer(max_df$value) # 转换类型和原始数据匹配

# 合并原始数据和max_df,筛选出符合条件的行
result_df <- merge(df, max_df, by = c("name", "value"))

# 查看结果
print(result_df)

这三种方法都能满足你的需求,根据数据集大小和个人习惯选择就好~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:05:04