我想知道如何最好地检查重复项,但以忽略 NA 值的方式 - 即,如果将一个值与 NA 进行比较,则将其视为匹配。
例如,如果我有这样的数据集
dt <- data.table(col1 = c("A", "B", NA, "A", "C", "C"),
col2 = c("Z", "Y", "Z", NA, "X", "X"),
col3 = c(1, 2, 1, 1, 3, 3))
dt
col1 col2 col3
1: A Z 1
2: B Y 2
3: <NA> Z 1
4: A <NA> 1
5: C X 3
6: C X 3
我希望将第 5 行和第 6 行标记为重复对,还希望将第 1 行和第 4 行标记为重复对。我知道的所有方法都只标记第 5 行和第 6 行。
例如,
dupes_flagged <- dt %>%
group_by(pick(1:3)) %>%
mutate(
dupe_group = cur_group_id()
)
dupes_flagged
col1 col2 col3 dupe_group
1: A Z 1 1
2: B Y 2 3
3: <NA> Z 1 5
4: A <NA> 1 2
5: C X 3 4
6: C X 3 4
dt <- dt %>% as.data.table()
dup = duplicated(dt, by = c("col1", "col2", "col3"))
dt[, dupe_group := dup | c(tail(dup, -1), FALSE)]
dt
col1 col2 col3 dupe_group
1: A Z 1 FALSE
2: B Y 2 FALSE
3: <NA> Z 1 FALSE
4: A <NA> 1 FALSE
5: C X 3 TRUE
6: C X 3 TRUE
双精度
Reduce
生成一个向量,表示特定行是否有重复项,可以是精确的,也可以是按NA
计算的。
Reduce(`|`, lapply(dt, function(col) {
Reduce(`|`, lapply(seq_along(col), function(i) {
replace(col, i, FALSE) %in% c(col[i], NA)
}))
}))
# [1] TRUE FALSE TRUE TRUE TRUE TRUE
也许这可以优化?