R语言单行多列联合删除数据框重复行代码失效原因咨询
问题原因
你遇到的现象本质是两个问题叠加导致的:
- 核心原因:两种去重逻辑完全不等价
你写的第一版单行代码实现的是多列联合去重:只有当某行的Column1、Column2、Column3三个值的组合,和之前已经出现过的某行三列值完全一致时,才会判定为重复行删除。如果你的数据集里不存在三列取值完全相同的行组合,运行后自然不会删除任何行,维度检查结果不会变化。
而你写的逐列去重是串行顺序去重:先在全量数据中删除Column1存在重复的行,再在第一次删除后的子集里删除Column2存在重复的行,最后在第二次删除后的子集里删除Column3存在重复的行。这个逻辑不需要三列取值同时重复,只要当前处理的列在剩余子集里有重复值就会删行,和联合去重的判定规则完全不同,结果没有可比性。
举个最简单的示例:
以上三行的三列取值组合全都是唯一的,用联合去重逻辑不会删除任何行;但用你的逐列串行逻辑:行号 Column1 Column2 Column3 1 A X 1 2 A Y 2 3 B X 3 - 第一步按Column1去重:行2的A和行1重复,删除行2,剩余行1、行3
- 第二步按Column2去重:行3的X和行1重复,删除行3,最终只剩行1
两种逻辑的结果差异极大。
- 代码存在低级语法笔误
你贴出的第一版代码里,c("Column1", "Column2", "Column3)最后一个列名缺少闭合的双引号,正常运行会直接抛出语法错误。如果你实际运行时没有报错,大概率是控制台自动补全了引号,代码语法本身是通顺的,只是数据确实满足“无三列同时重复的行”的情况,所以没有删行。
正确实现代码
根据你的实际需求选对应方案即可,都是单行实现且运行效率满足要求:
- 如果你的真实需求是三列联合去重(三列取值完全一致才判定为重复),修正笔误后的基础包代码就可以直接用,无额外依赖:
dataframe <- dataframe[!duplicated(dataframe[c("Column1", "Column2", "Column3")]), ]
- 如果你的真实需求是和你逐列写法效果完全一致的串行顺序去重(按列的优先级依次去重,每一步只判断当前列是否重复),基础包单行实现如下,和你逐行赋值的运行结果完全一致:
for(col in c("Column1", "Column2", "Column3")) dataframe <- dataframe[!duplicated(dataframe[[col]]), ]
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

