如何在忽略 NA 的情况下检查重复项(NA 值被视为匹配)

问题描述 投票:0回答:1

我想知道如何最好地检查重复项,但以忽略 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
r dplyr duplicates data.table na
1个回答
0
投票

双精度

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

也许这可以优化?

© www.soinside.com 2019 - 2024. All rights reserved.