Удаление повторяющихся записей в кадре данных на основе значений столбца списка - PullRequest
1 голос
/ 05 мая 2020

У меня есть фрейм данных, который содержит повторяющиеся значения в столбце списка, и я хочу сохранить только первое появление каждого уникального значения.

Допустим, у меня есть следующий тиббл:

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

Есть ли какой-нибудь «чистый» способ достичь того, чего я хочу?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я пришел к ответу, но я думаю, что он довольно многословен (и подозреваю, что он тоже может быть медленным):

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]>
1 голос
/ 05 мая 2020

Один из вариантов - использовать filter с duplicated

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