优先删除数据帧中的部分重复项

Lor*_*cán 5 r dataframe

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

考虑以下示例:

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

我想删除在col.1和中都col.2重复的行,同时始终保留具有的重复行col.3 == 'a',否则对保留的重复行没有偏好。在此示例的情况下,结果数据帧将如下所示:

# Output.
col.1 col.2 col.3
    1     1     a
    2     2     a
    3     2     c
Run Code Online (Sandbox Code Playgroud)

感谢所有帮助!

Sot*_*tos 5

我们可以先订购col.3并删除重复的商品,即

d1 <- df[with(df, order(col.3)),]
d1[!duplicated(d1[c(1, 2)]),]
#  col.1 col.2 col.3
#3     1     1     a
#5     2     2     a
#7     3     2     c
Run Code Online (Sandbox Code Playgroud)


akr*_*run 1

slice如果行数大于1,则可以选择按“col.1”、“col.2”和将“col.3”作为“a”的行进行分组,否则返回第一行

library(dplyr)
df %>% 
   group_by(col.1, col.2) %>%
   slice(if(n() > 1) which(col.3 == 'a') else 1)
# A tibble: 3 x 3
# Groups:   col.1, col.2 [3]
#  col.1 col.2 col.3
#  <dbl> <dbl> <fct>
#1     1     1 a    
#2     2     2 a    
#3     3     2 c    
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是按“col.1”、“col.2”分组,然后将“a”与“col.3”slice进行 ing 得到的索引match。如果存在nomatch,我们返回索引 1。

df %>% 
   group_by(col.1, col.2) %>% 
   slice(match("a", col.3, nomatch = 1))
# A tibble: 3 x 3
# Groups:   col.1, col.2 [3]
#  col.1 col.2 col.3
#  <dbl> <dbl> <fct>
#1     1     1 a    
#2     2     2 a    
#3     3     2 c    
Run Code Online (Sandbox Code Playgroud)