我有一个想要减少的“索引”数据集。我想减少与另一行相比相同但具有 NA 的行。但是,如果一列中包含另一列中没有的信息,我不想删除行。例如:
第 1 栏 | 第 2 栏 | 第3栏 | 第 4 栏 | 第 5 栏 |
---|---|---|---|---|
A | B | D | G | 不适用 |
A | B | 不适用 | 不适用 | 不适用 |
A | B | 不适用 | 不适用 | H |
不适用 | 不适用 | D | G | 不适用 |
不适用 | 不适用 | 不适用 | 不适用 | H |
会减少到
第 1 栏 | 第 2 栏 | 第3栏 | 第 4 栏 | 第 5 栏 |
---|---|---|---|---|
A | B | D | G | 不适用 |
A | B | 不适用 | 不适用 | H |
由于第 2 行和第 4 行是第 1 行的较弱重复项,因此它们被删除。第 3 行与第 1 行不同,因为它有 H,因此包含我想要保留的信息,并且不是第 1 行的重复。第 5 行是第 3 行的重复,是否也将其删除。
我想将其应用到很多列,所以我相信不使用“group_by”。有编码建议吗?
我考虑过 dplyr、group_by、na.omit 和重复项,但找不到合适的 R代码:
data= data.frame(col1=c("A", "A", "A", NA, NA),
col2=c("B", "B", "B", NA, NA),
col3=c("D", NA, NA, "D", NA),
col4=c("G", NA, NA, "G", NA),
col5=c(NA, NA, "H", NA,"H"))
这是一个基本的 R 方法:
keep <- sapply(1:nrow(quux), function(rn1) {
for (rn2 in setdiff(1:nrow(quux), rn1)) {
weakerdupe <- mapply(quux[rn1,], quux[rn2,], FUN = function(a, b) a %in% c(b, NA))
if (all(weakerdupe) && sum(is.na(quux[rn1,])) >= sum(is.na(quux[rn2,]))) return(FALSE)
}
TRUE
})
quux[keep,]
# Col1 Col2 Col3 Col4 Col5
# 1 A B D G <NA>
# 3 A B <NA> <NA> H