R语言按id分组标记多form来源并按高频form去重方法
R实现数据标记与去重方案
直接用dplyr包即可完成两步操作,逻辑清晰易维护,具体实现如下:
前置准备
先加载依赖包,未安装的话可先运行install.packages("dplyr")完成安装:
library(dplyr)
第一步:添加type标记列生成df.1
核心判断逻辑:按id分组后,只要存在任意一个key对应多个不同form值,该id下所有行标记为multiple,否则标记为single。
df.1 <- df %>% # 按id+key分组,检查每个key下是否存在多form冲突 group_by(id, key) %>% mutate(key_has_conflict = n_distinct(form) > 1) %>% # 回到id分组维度,判断当前id是否存在任意冲突 group_by(id) %>% mutate(type = ifelse(any(key_has_conflict), "multiple", "single")) %>% ungroup() %>% # 删除中间辅助列 select(-key_has_conflict)
运行后输出的df.1和给出的期望结果完全一致。
第二步:筛选主导form去重生成df.2
核心规则:按id分组,先统计每个form的出现频次,保留频次最高的dominant form对应的行,再对同id下重复key去重即可。
df.2 <- df.1 %>% # 按id+form分组,统计每个form在对应id下的条目数 group_by(id, form) %>% mutate(form_freq = n()) %>% # 回到id分组维度,只保留频次最高的form对应的行 group_by(id) %>% filter(form == form[which.max(form_freq)]) %>% # 同id同key只保留唯一行 distinct(id, key, .keep_all = TRUE) %>% ungroup() %>% # 删除中间辅助列 select(-form_freq)
边界情况说明:如果遇到同一id下多个form出现频次完全相等的场景,可以在
which.max前补充自定义优先级规则,比如优先保留字母序靠前的form,避免筛选结果随机。
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

