Verificar se existem linhas com conteúdos iguais em duas tibbles

Tenho duas tibbles muito parecidas, com nomes de canais no Youtube, que possuem 20 linhas cada. Quero criar uma nova tibble com apenas os nomes dos canais que aparecem nessas 2 tibbles. A ideia é verificar se cada linha da primeira tibble possui o mesmo conteúdo em uma das linhas da segunda tibble. Fiz o código abaixo, que não tá funcionando.

resposta9 ← tibble()
for (lines in 1:nrow(resposta3)){
if (resposta3$Nome_do_Canal(lines) %in% resposta4$Nome_do_Canal){
mutate(resposta9, Nome_do_Canal ← as.character(resposta3$Nome_do_Canal))
}
}

Bom dia, Kaique!

Tem uma forma bem mais simples de fazer isso sem utilizar for. Pra casos como esse a função dplyr::case_when já resolve muito bem.

Segue um exemplo reproduzível:

# Cria bases para exemplo -------------------------------------------------
base1 <- tibble::tribble(
    ~nomes_1,
         "A",
         "B",
         "C",
         "D",
         "E",
         "F",
         "G",
         "H"
    )

base2 <- tibble::tribble(
    ~nomes_2,
         "B",
         "L",
         "M",
         "N",
         "O",
         "E",
         "A",
         "C"
    )

# Manipulações ------------------------------------------------------------

# gerar uma base 3 usando como fonte a base1
base3 <- base1 |> 
    dplyr::mutate(
        
        # criar uma coluna na base1 que diz se o item existe ou não na base2 
        nova_base = dplyr::case_when(
            
            # se o nome existir na coluna nomes_2 da base2 então irá colocar essa info na coluna
            nomes_1 %in% base2$nomes_2 ~ "Existe na segunda base",
            
            # se não existe, colocará "nao existe"
            TRUE ~ "Não existe"
            
        )
    )

print(base3)
#> # A tibble: 8 x 2
#>   nomes_1 nova_base             
#>   <chr>   <chr>                 
#> 1 A       Existe na segunda base
#> 2 B       Existe na segunda base
#> 3 C       Existe na segunda base
#> 4 D       Não existe            
#> 5 E       Existe na segunda base
#> 6 F       Não existe            
#> 7 G       Não existe            
#> 8 H       Não existe

# gerar a base 3 final
base_3_final <- base3 |> 
    
    # filtr aapenas o que existe na segunda base
    dplyr::filter(nova_base == "Existe na segunda base") |> 
    
    # seleciona só a coluna com os nomes
    dplyr::select(nomes_1)
  
print(base_3_final)
#> # A tibble: 4 x 1
#>   nomes_1
#>   <chr>  
#> 1 A      
#> 2 B      
#> 3 C      
#> 4 E

Created on 2021-10-28 by the reprex package (v2.0.0)

Se tiver restado alguma dúvida, só perguntar.

Abraços.

Kaique,

Minha sugestão é usar a função semi_join() do pacote dplyr, pois eu acho que ela faz exatamente o que você quer. Veja se o código abaixo atende ao seu requisito:

# Bases de exemplo
resposta3 <- tibble::tibble(Nome_do_Canal = sample(LETTERS, 20))
resposta4 <- tibble::tibble(Nome_do_Canal = sample(LETTERS, 20))

# Demonstração das bases
head(resposta3)
#> # A tibble: 6 × 1
#>   Nome_do_Canal
#>   <chr>        
#> 1 K            
#> 2 B            
#> 3 X            
#> 4 Y            
#> 5 P            
#> 6 J
head(resposta4)
#> # A tibble: 6 × 1
#>   Nome_do_Canal
#>   <chr>        
#> 1 R            
#> 2 E            
#> 3 G            
#> 4 Q            
#> 5 M            
#> 6 Y

# A função semi_join() retorna todas as linhas da primeira
# base com correspondência na segunda base
dplyr::semi_join(resposta3, resposta4, "Nome_do_Canal")
#> # A tibble: 17 × 1
#>    Nome_do_Canal
#>    <chr>        
#>  1 B            
#>  2 X            
#>  3 Y            
#>  4 P            
#>  5 J            
#>  6 L            
#>  7 G            
#>  8 I            
#>  9 V            
#> 10 D            
#> 11 C            
#> 12 S            
#> 13 T            
#> 14 Q            
#> 15 Z            
#> 16 E            
#> 17 O

Created on 2021-10-28 by the reprex package (v2.0.1)

Que show, Caio!
Nunca tinha usado a semi_join, legal conhecer ela também.

muito obrigado pessoa!!

1 curtida