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

基于列中最常见条目修剪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")
)

期望输出

最终要得到的结果:

IndexGrade
1A
2B
2C
3A
4C
4D

方法一:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:52:16