优先删除数据框中的部分重复项,具体取决于多列

时间:2019-05-20 16:17:41

标签: r dataframe

在删除一列中重复的行时,是否可以根据第二列和第三列优先保留重复的行之一?

考虑以下示例:

# Example dataframe.
df <- data.frame(col.1 = c(1, 1, 1, 2, 2, 2, 3, 3),
                 col.2 = c('a', 'b', 'b', 'a', 'b', 'c', 'a', 'a'),
                 col.3 = c('b', 'c', 'a', 'b', 'a', 'b', 'c', 'b'))
# Output
col.1 col.2 col.3
    1     a     b
    1     b     c
    1     b     a
    2     a     b
    2     b     a
    2     c     b
    3     a     c
    3     a     b

我想删除col.1中重复的行,同时优先保留具有col.2 == 'b'col.3 == 'c'的行。 col.2col.3中的匹配项是最优选的,而col.2中的单个匹配项比col.3中的单个匹配项和仅一列中的匹配项更受欢迎优先于完全不匹配。对于没有匹配项的重复行,可以保留任何重复行。

在给出的示例中,结果数据帧如下所示:

# Output.
col.1 col.2 col.3
    1     b     c
    2     b     a 
    3     a     c

谢谢!

2 个答案:

答案 0 :(得分:1)

我们将'col.1',filter行分组,其中'col.2'是'b'或'col.3'是'c',然后filter排在{{1 }}行基于'col.2'和'col.3'值

duplicated

答案 1 :(得分:0)

如果您group_bycol.1 col.3同时保留具有col.2 == 'b'的重复项。然后,您仅获取group_bycol.1的输出,同时优先保留具有col.3 == 'c'的重复项,最终得到所需的结果。如果更改了首选值,这也将遵循所需的逻辑。

df %>%
  group_by(col.1, col.3) %>%
  slice(match('b', col.2, nomatch = 1)) %>%
  group_by(col.1) %>%
  slice(match('c', col.3, nomatch = 1))


# Output:
# A tibble: 3 x 3
# Groups:   col.1 [3]
  col.1 col.2 col.3
  <dbl> <fct> <fct>
1     1 b     c    
2     2 b     a    
3     3 a     c