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

如何在移除重复行(如使用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  

步骤解释

  1. group_by(id):把数据按受访者id分成独立的小组,这样我们可以逐个检查每个受访者的两次回答是否一致。
  2. filter(n_distinct(country) == 1):用n_distinct()统计每个分组内country的唯一值数量,只保留数量等于1的分组——也就是两次国籍回答完全相同的受访者,那些回答矛盾的(比如id=2、4)会被直接过滤掉。
  3. distinct(id, .keep_all = TRUE):对筛选后的有效分组执行去重,每个id只保留一行数据,同时保留所有列的信息。
  4. ungroup():取消分组状态,让数据回到常规的 tibble/data.frame 格式,方便后续操作。

这样就完美实现了你的两个目标:先剔除回答不一致的无效受访者,再对有效数据进行去重,比直接用distinct()更精准地满足了数据清洗需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:39:08