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

如何基于count变量及coder层级移除DataFrame中的重复行

解决DataFrame按id去重:基础方案与优先级方案

你需要为每个id保留唯一记录,针对你的两种需求(基础方案、优先级方案),以下是高效可靠的实现方法,同时解释你原有循环失效的原因:

原有循环的问题

你的for循环每次操作都基于原始数据集查找索引,且仅将结果赋值给x2却未更新循环依赖的x,后续循环仍用原始数据的索引判断,在大数据集里会导致索引混乱,最终失效。这类分组筛选场景完全不需要循环,向量化或分组操作更高效且不易出错。


基础方案:保留每个id的第一条记录

方法1:Base R 实现

利用duplicated()标记重复行,直接筛选非重复的首条记录:

# 保留每个id的第一条记录
x_base <- x[!duplicated(x$id), ]

方法2:dplyr 实现(更直观)

通过分组后取组内第一行:

library(dplyr)
x_base <- x %>% 
  group_by(id) %>% 
  slice(1) %>% 
  ungroup()

优先方案:按coder层级筛选(A>B>C>D>E)

先定义coder的优先级顺序,再按id分组,每组内保留优先级最高的记录:

方法1:Base R 实现

# 定义coder优先级顺序
coder_order <- c("A", "B", "C", "D", "E")
# 将coder转为有序因子,确保排序符合优先级
x$coder <- factor(x$coder, levels = coder_order, ordered = TRUE)
# 按id分组,组内按coder优先级排序后取第一条
x_priority <- x[order(x$id, x$coder), ]
x_priority <- x_priority[!duplicated(x_priority$id), ]

方法2:dplyr 实现(更简洁)

library(dplyr)
x_priority <- x %>% 
  mutate(coder = factor(coder, levels = c("A", "B", "C", "D", "E"), ordered = TRUE)) %>% 
  group_by(id) %>% 
  # 取组内coder优先级最高的第一条记录
  slice_min(order_by = coder, n = 1) %>% 
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:15:46