基于列中最常见条目修剪DataFrame的实现方案
解决方案
示例数据
先构造测试用的DataFrame:
library(tibble) df <- tibble( Index = c(1,1,1,2,2,3,4,4,4,4), Grade = c("A", "A", "B", "B", "C", "A", "C", "C", "D", "D") )
期望输出
最终要得到的结果:
| Index | Grade |
|---|---|
| 1 | A |
| 2 | B |
| 2 | C |
| 3 | A |
| 4 | C |
| 4 | D |
方法一:使用dplyr
通过两次分组实现:先统计每组Index下各Grade的出现次数,再筛选出次数等于组内最大值的条目:
library(dplyr) df %>% # 按Index和Grade分组,统计每个组合的出现次数 group_by(Index, Grade) %>% tally(name = "count") %>% # 回到按Index分组,筛选出次数等于组内最大值的行 group_by(Index) %>% filter(count == max(count)) %>% # 保留需要的列并取消分组 select(Index, Grade) %>% ungroup()
方法二:使用Base R
方式1:基于表格统计与合并
# 统计Index-Grade组合的出现频率 freq_df <- as.data.frame(table(df$Index, df$Grade), stringsAsFactors = FALSE) colnames(freq_df) <- c("Index", "Grade", "count") freq_df$Index <- as.integer(freq_df$Index) # 计算每个Index组的最大频率 max_counts <- aggregate(count ~ Index, data = freq_df, FUN = max) # 合并数据并筛选出符合条件的条目 result <- merge(freq_df, max_counts, by = "Index") %>% subset(count.x == count.y) %>% select(Index, Grade) # 按Index排序(可选,保持和示例顺序一致) result <- result[order(result$Index), ]
方式2:拆分-处理-合并
通过拆分数据框为组,逐个处理后合并结果:
# 按Index拆分Grade列 grade_groups <- split(df$Grade, df$Index) # 定义处理单个组的函数:找出频率最高的Grade process_single_group <- function(grades, index_val) { freq_table <- table(grades) max_freq <- max(freq_table) top_grades <- names(freq_table[freq_table == max_freq]) data.frame(Index = index_val, Grade = top_grades, stringsAsFactors = FALSE) } # 遍历所有组并合并结果 result_list <- mapply(process_single_group, grade_groups, names(grade_groups), SIMPLIFY = FALSE) result <- do.call(rbind, result_list)
内容的提问来源于stack exchange,提问作者Luther_Proton
相关产品推荐
相关产品推荐

