根据列表列的值删除数据框中的重复记录

Removing duplicate records in a dataframe based on the values of a list column

我有一个数据框,它在列表列中包含重复值,我只想保留每个唯一值的第一次出现。

假设我有以下问题:

df <- tribble(
  ~x, ~y,
  1,  tibble(a = 1:2, b = 2:3),
  2,  tibble(a = 1:2, b = 2:3),
  3,  tibble(a = 0:1, b = 0:1)
)

df
#> # A tibble: 3 x 2
#>       x y               
#>   <dbl> <list>          
#> 1     1 <tibble [2 x 2]>
#> 2     2 <tibble [2 x 2]>
#> 3     3 <tibble [2 x 2]>

期望的结果是:

desired_df
#> # A tibble: 2 x 2
#>       x y               
#>   <dbl> <list>          
#> 1     1 <tibble [2 x 2]>
#> 2     3 <tibble [2 x 2]>

不是 y 我可以使用 distinct(df, y, .keep_all = TRUE) 的列表列,但函数不正确支持列表列,如图所示:

distinct(df, y, .keep_all = TRUE)
#> Warning: distinct() does not fully support columns of type `list`.
#> List elements are compared by reference, see ?distinct for details.
#> This affects the following columns:
#> - `y`
#> # A tibble: 3 x 2
#>       x y               
#>   <dbl> <list>          
#> 1     1 <tibble [2 x 2]>
#> 2     2 <tibble [2 x 2]>
#> 3     3 <tibble [2 x 2]>

有什么"clean"方法可以实现我想要的吗?

一种选择是将 filterduplicated

一起使用
library(dplyr)    
df %>%
    filter(!duplicated(y))

我找到了答案,但我认为它相当 "wordy"(我怀疑它也可能很慢):

df <- df %>% 
  mutate(unique_list_id = match(y, unique(y))) %>% 
  group_by(unique_list_id) %>% 
  slice(1) %>% 
  ungroup() %>% 
  select(-unique_list_id)

df
#> # A tibble: 2 x 2
#>       x y               
#>   <dbl> <list>          
#> 1     1 <tibble [2 x 2]>
#> 2     3 <tibble [2 x 2]>