【问题标题】:Removing duplicate records in a dataframe based on the values of a list column根据列表列的值删除数据框中的重复记录
【发布时间】:2020-05-05 20:35:34
【问题描述】:

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

假设我有以下小标题:

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]>

有什么“干净”的方式来实现我想要的吗?

【问题讨论】:

  • 我希望我的解决方案是一个干净的选择

标签: r dataframe dplyr distinct tidyverse


【解决方案1】:

一种选择是使用filterduplicated

library(dplyr)    
df %>%
    filter(!duplicated(y))

【讨论】:

  • 不幸的是,我刚刚意识到这种方法,即使它适用于我发布的案例,也不适用于其他一些更“复杂”的案例。例如,如果我有以下数据帧df &lt;- tribble(~x, ~y, 1, tibble(a = 1:2, b = 2:3), 2, tibble(a = c(1, 3), b = 2:3), 3, tibble(a = 0:1, b = 0:1)),我想要的输出将是与df 相同的数据帧,因为没有嵌套数据帧是重复的,但所有建议的解决方案都删除了第二行中数据帧的第一行,因为它与第一个数据框的第一行相同。
  • @dhersz 有了这个新数据集,我得到了两个 2 行的“x”,“y”中的 1 行 2 和 2 的 3。不确定您的预期
  • @dhersz 在您自己的解决方案中,它不会删除任何行
  • 我可能表达得很糟糕。我想要的是删除重复的嵌套数据框,而不是这些数据框中的行。因此,例如,在原始 tibble 中,删除整个第二行就可以了。对于我在之前评论中所做的数据框,无需删除任何行,因为列表列中的所有数据框都是唯一的。
  • @dhersz 所以,它基本上是每个小标题内的重复而不是跨越?
【解决方案2】:

我已经找到了答案,但我认为它很“罗嗦”(我怀疑它也可能很慢):

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]>

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多