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
相关产品推荐
相关产品推荐

