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

如何移除除指定两列外其余列均重复的数据行?

移除除指定两列外其余列均重复的行

问题背景

现有一个包含40列的数据框,需要忽略其中两列,移除其余所有列值完全重复的行。已知如何排除单列进行去重,但无法实现排除两列的操作。以下是示例数据及期望结果:

示例数据框df1

df1 <- data.frame(x1 = c("1", "1", "1", "1", "1", "1", "2", "2", "2", "2", "2", "2", "3", "3", "3", "3", "3", "3"),
                  x2 = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C"),
                  x3 = c("A1", "A1", "A2", "A2", "A3", "A3", "B1", "B1", "B2", "B2", "B3", "B3", "C1", "C1", "C2", "C2", "C3", "C3"),
                  x4 = c("35", "43", "33", "33", "63", "24", "14", "25", "77", "77", "94", "51", "34", "36", "55", "55", "73", "72"),
                  x5 = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"),
                  x6 = c("XA", "XB", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XK", "XL", "XM", "XN", "XO", "XP", "XQ", "XR"))

期望结果df2

df2 <- data.frame(x1 = c("1", "1", "1", "1", "1", "2", "2", "2", "2", "2", "3", "3", "3", "3", "3"),
                  x2 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C"),
                  x3 = c("A1", "A1", "A2", "A3", "A3", "B1", "B1", "B2", "B3", "B3", "C1", "C1", "C2", "C3", "C3"),
                  x4 = c("35", "43", "33", "63", "24", "14", "25", "77", "94", "51", "34", "36", "55", "73", "72"),
                  x5 = c("1", "2", "3", "5", "6", "7", "8", "9", "11", "12", "13", "14", "15", "17", "18"),
                  x6 = c("XA", "XB", "XC", "XE", "XF", "XG", "XH", "XI", "XK", "XL", "XM", "XN", "XO", "XQ", "XR"))

解决方案

方法1:通过列索引排除指定列

在R中,要排除多个列,只需将列索引用c()包裹后取反即可,代码如下:

# 排除第5、6列(x5、x6),判断其余列的重复行并保留非重复项
df_result <- df1[!duplicated(df1[, -c(5, 6)]), ]

方法2:通过列名排除指定列(更直观)

当列数较多时,用列名指定排除项更不容易出错,可通过setdiff()获取需要判断重复的列:

# 获取除x5、x6外的所有列名
target_cols <- setdiff(names(df1), c("x5", "x6"))
# 基于目标列判断重复,保留所有列的非重复行
df_result <- df1[!duplicated(df1[, target_cols]), ]

方法3:使用dplyr包(tidyverse生态)

如果习惯使用tidyverse工具,dplyr::distinct()函数可以更简洁地实现需求,通过across()指定排除的列,.keep_all = TRUE保留所有列:

library(dplyr)
df_result <- df1 %>% 
  distinct(across(-c(x5, x6)), .keep_all = TRUE)

以上三种方法均能得到与df2一致的结果,可根据自己的代码习惯选择。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:23:15