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))
}
}
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
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