如何移除除指定两列外其余列均重复的数据行?
移除除指定两列外其余列均重复的行
问题背景
现有一个包含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
相关产品推荐
相关产品推荐

