【发布时间】:2021-12-12 16:34:16
【问题描述】:
我需要检查行是否部分重复并删除/覆盖 2 列与存在 3 值的不同行匹配的行。一个问题是,“真实”数据框包含几个列表列,这使得某些操作不可行。最好的情况是,如果可以独立于列号检查任何可以找到匹配项的行 - 这意味着仅保留具有非 NA 值的列最多的行(在所有包含匹配列值的列中)。
o1 o2 o3
1 1 NA NA
2 2 NA NA
3 3 NA NA
4 4 NA NA
5 6 NA NA
6 7 NA NA
7 5 9 NA # this row has only 2 values which match values from row 11 but the last value is na
8 10 NA NA
9 12 NA NA
10 13 NA NA
11 5 9 14 # this row has values in all 3 columns
12 14 NA NA
13 8 11 15 # so does this row
14 16 NA NA
15 17 NA NA
16 18 NA NA
17 19 NA NA
18 20 NA NA
结果应该是相同的数据帧 - 只是没有第 7 行或第 7 行被第 11 行覆盖。
这应该很容易做到,但由于某种原因我没有管理它(除了一个复杂的 for 循环,如果以后添加更多列,则很难概括)。有没有直接的方法可以做到这一点?
上述df的输入:
structure(list(o1 = c(1L, 2L, 3L, 4L, 6L, 7L, 5L, 10L, 12L, 13L,
5L, 14L, 8L, 16L, 17L, 18L, 19L, 20L), o2 = c(NA, NA, NA, NA,
NA, NA, 9L, NA, NA, NA, 9L, NA, 11L, NA, NA, NA, NA, NA), o3 = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 14L, NA, 15L, NA, NA, NA,
NA, NA)), row.names = c(NA, -18L), class = "data.frame")
如果已经有类似问题的答案,请告诉我。
【问题讨论】: