如何基于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
相关产品推荐
相关产品推荐

