使用duplicated()的incomparables=NA处理数据框NA重复值报错问题
解决R中duplicated()处理数据框时incomparables=NA失效的问题
问题原因
duplicated()函数的incomparables参数仅对向量输入生效,针对数据框的duplicated.data.frame()方法并未实现该参数的支持,直接传入会触发报错,这是R的设计限制。
解决方案
要实现「包含NA的行不被判定为重复(返回FALSE)」的需求,可以手动拆分逻辑:先对无NA的行做重复检测,再将含NA的行的重复结果强制设为FALSE。
方法1:基础R实现
# 构造测试数据框 df <- data.frame( x = c(1, 2, 2, 3, NA, NA), y = c(2, 3, 3, 5, NA, NA) ) # 标记所有无缺失值的行 no_na_rows <- complete.cases(df) # 初始化重复结果向量 dup_result <- logical(nrow(df)) # 对无缺失值的行检测重复 dup_result[no_na_rows] <- duplicated(df[no_na_rows, ]) # 含NA的行直接设为FALSE dup_result[!no_na_rows] <- FALSE # 输出结果 dup_result # [1] FALSE FALSE TRUE FALSE FALSE FALSE
方法2:tidyverse/dplyr实现
如果习惯使用tidyverse生态,可以结合anyNA()和duplicated()实现:
library(dplyr) df %>% mutate( is_duplicated = case_when( anyNA(across(everything())) ~ FALSE, TRUE ~ duplicated(pick(everything())) ) )
验证结果
两种方法都会得到符合预期的结果:含NA的行不会被判定为重复,仅无NA的重复行返回TRUE。
内容的提问来源于stack exchange,提问作者rickmatz
相关产品推荐
相关产品推荐

