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

