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

R + dplyr:如何对Tibble进行行的部分去重

仅针对特定条件重复行的去重方案(R语言dplyr)

在R语言中移除数据框的重复行时,dplyr包的distinct()函数是常用工具,但如果只需要对特定变量组合的重复行去重(比如仅处理x==3且z=="k"的重复行),直接传入条件的写法无法达到预期,以下是可行解决方案。

示例数据

先加载包并创建测试数据集:

library(dplyr)

df <- tibble(x=rep(seq(5), 3), y=rep(LETTERS[1:5],3),
             z=c(rep(c("h","j","k","t","u"), 2), LETTERS[1:5])
             )

该数据集中,x=3且z="k"的行存在2条重复,而其他如x=1且z="h"的重复行我们希望保留。

错误尝试

直接传入条件逻辑值的写法会生成新的逻辑列,完全偏离需求:

# 错误写法,不符合预期
df_ded_partial <- df |> distinct(x==3, z=="k")

正确解决方案

方法1:拆分处理后合并

将数据拆分为「需要去重的目标行」和「无需处理的其他行」,分别处理后再合并:

df_ded_partial <- df |>
  # 筛选目标行并去重
  filter(x == 3 & z == "k") |>
  distinct() |>
  # 合并无需处理的行
  bind_rows(df |> filter(!(x == 3 & z == "k"))) |>
  # 按x排序恢复原数据的大致顺序
  arrange(x)

处理后,x=3且z="k"的重复行仅保留1条,其他重复行全部保留。

方法2:分组保留首行

通过自定义分组键,让目标行归为同一组并仅保留首行,其他行各自为组保留全部内容:

df_ded_partial <- df |>
  group_by(
    # 目标行归为同一组,其他行按唯一标识分组
    ifelse(x == 3 & z == "k", "target", paste(x, y, z, sep = "_"))
  ) |>
  slice_head(n = 1) |>
  ungroup() |>
  select(-group) # 删除临时分组列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:45:28