如何在移除重复行(如使用dplyr::distinct())的同时,根据指定列的一致性完全删除部分实例?
解决方法:过滤一致组后再去重
这是个非常典型的数据清洗场景,我们可以通过dplyr的分组、过滤和去重组合操作来实现你的需求——只保留那些同一受访者(id)两次国籍回答完全一致的记录,同时完成去重。
完整代码实现
library(dplyr) df_clean <- df_final %>% # 按受访者id分组,针对每个个体的数据单独处理 group_by(id) %>% # 筛选出分组内国籍唯一值数量为1的组(即两次回答一致) filter(n_distinct(country) == 1) %>% # 对符合条件的组执行去重,保留每组一行数据 distinct(id, .keep_all = TRUE) %>% # 取消分组,恢复常规数据框结构 ungroup() # 查看清洗后的结果 df_clean
运行结果
# A tibble: 5 × 4 id height weight country <int> <int> <int> <chr> 1 1 156 189 uk 2 3 195 190 germany 3 5 188 184 india 4 8 155 130 morroco 5 10 202 97 italy
步骤解释
group_by(id):把数据按受访者id分成独立的小组,这样我们可以逐个检查每个受访者的两次回答是否一致。filter(n_distinct(country) == 1):用n_distinct()统计每个分组内country的唯一值数量,只保留数量等于1的分组——也就是两次国籍回答完全相同的受访者,那些回答矛盾的(比如id=2、4)会被直接过滤掉。distinct(id, .keep_all = TRUE):对筛选后的有效分组执行去重,每个id只保留一行数据,同时保留所有列的信息。ungroup():取消分组状态,让数据回到常规的 tibble/data.frame 格式,方便后续操作。
这样就完美实现了你的两个目标:先剔除回答不一致的无效受访者,再对有效数据进行去重,比直接用distinct()更精准地满足了数据清洗需求。
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

