Recuperar valores únicos de cada elemento de uma lista

Bom dia pessoal,
Tenho uma lista com 3 elementos e gostaria de recuperar os valores únicos da lista, mas mantendo o elemento de onde ele veio. Como seria possível fazer isso?

Segue um exemplo reprodutível (não consegui fazer o reprex funcionar, então segue um copy e paste :frowning: ):

arquivo_a ← c(“TcCLB.222657.20”,“TcCLB.506657.10”,“TcCLB.480975.10”)
arquivo_b ← c(“TcCLB.222657.20”,“TcCLB.506657.10”,“TcCLB.480975.11”)
arquivo_c ← c(“TcCLB.222657.20”,“TcCLB.506657.10”,“TcCLB.480975.12”)

list ← list(A = arquivo_a, B = arquivo_b, C = arquivo_c)

Lista criada:
$A
[1] “TcCLB.222657.20” “TcCLB.506657.10” “TcCLB.480975.10”

$B
[1] “TcCLB.222657.20” “TcCLB.506657.10” “TcCLB.480975.11”

$C
[1] “TcCLB.222657.20” “TcCLB.506657.10” “TcCLB.480975.12”

Output esperado:

$A
[1] “TcCLB.480975.10”

$B
[1] “TcCLB.480975.11”

$C
[1] “TcCLB.480975.12”

Laila, eu não achei um jeito super simples de resolver o problema, mas acho que minha solução pelo menos atende aos requisitos.

O que eu faço no código abaixo é transformar a lista em uma tabela e agrupá-la por valor (os “TcCLB…” que você tem). Depois eu jogo fora os grupos que têm mais de 1 linha e transformo de volta a tabela no formato que você quer.

library(magrittr)

arquivo_a <- c("TcCLB.222657.20", "TcCLB.506657.10", "TcCLB.480975.10")
arquivo_b <- c("TcCLB.222657.20", "TcCLB.506657.10", "TcCLB.480975.11")
arquivo_c <- c("TcCLB.222657.20", "TcCLB.506657.10", "TcCLB.480975.12")

list <- list(A = arquivo_a, B = arquivo_b, C = arquivo_c)

list %>%
  tibble::as_tibble() %>%
  tidyr::pivot_longer(dplyr::everything()) %>%
  dplyr::group_by(value) %>%
  dplyr::filter(dplyr::n() == 1) %>%
  dplyr::ungroup() %>%
  tidyr::pivot_wider(names_from = name, values_from = value) %>%
  as.list()
#> $A
#> [1] "TcCLB.480975.10"
#> 
#> $B
#> [1] "TcCLB.480975.11"
#> 
#> $C
#> [1] "TcCLB.480975.12"

Created on 2022-04-26 by the reprex package (v2.0.1)

Ei Caio, obrigada pela resposta. Dessa maneira funciona bem pra mim, mas tem um porém que esqueci de mencionar, os elementos possuem quantidades diferentes de identificadores. Por exemplo:
A - 8773 identificadores
B- 8757 identificadores
C- 8993 identificadores
Sendo assim, não estou conseguindo transformar a lista em tibble. Será que existe outra maneira?

O código ficou mais feioso, mas é possível criar a tabela já empilhada, isto é, sem precisar do pivot_longer().

library(magrittr)

arquivo_a <- c("TcCLB.222657.20", "TcCLB.222657.20", "TcCLB.506657.10", "TcCLB.480975.10")
arquivo_b <- c("TcCLB.222657.20", "TcCLB.506657.10", "TcCLB.480975.11")
arquivo_c <- c("TcCLB.222657.20", "TcCLB.506657.10", "TcCLB.480975.12")

list <- list(A = arquivo_a, B = arquivo_b, C = arquivo_c)

list %>%
  purrr::imap_dfr(~ tibble::tibble(name = .y, value = .x)) %>%
  dplyr::group_by(value) %>%
  dplyr::filter(dplyr::n() == 1) %>%
  dplyr::ungroup() %>%
  tidyr::pivot_wider(names_from = name, values_from = value) %>%
  as.list()
#> $A
#> [1] "TcCLB.480975.10"
#> 
#> $B
#> [1] "TcCLB.480975.11"
#> 
#> $C
#> [1] "TcCLB.480975.12"

Created on 2022-04-26 by the reprex package (v2.0.1)

Oi Caio, agora funcionou! Muito obrigada :slight_smile:

1 curtida