Tenho uma base de vídeos relacionados a Flutter no YouTube e quero selecionar todos os canais que possuem o termo “Flutter” em seu nome. Criei um campo do tipo logical que deve conter TRUE quando o termo está presente. Porém, estou com um erro que não sei resolver, relacionado ao for().
Erro:
Error in for (. in linha) 1:nrow(flutter_videos_filtrada) :
4 arguments passed to ‘for’ which requires 3
Código:
contem_palavra ← logical() #criando um campo lógico
resposta8 ←
flutter_videos_filtrada %>%
select(channelTitle, channelId) %>%
mutate(contem_palavra) %>%
for (linha in 1:nrow(flutter_videos_filtrada)){
if (str_detect(flutter_videos_filtrada$channelTitle,
regex(“flutter”, ignore_case = TRUE)) == TRUE){
contem_palavra = TRUE}
else {
contem_palavra = FALSE
}
} %>%
filter(contem_palavra = TRUE) %>%
group_by(channelTitle)
Bom dia Kaique!
Nesse caso, o melhor não é usar o for()
, e sim a função case_when() do pacote dplyr: A general vectorised if — case_when • dplyr
Fiz um exemplo com a base do starwars que está no pacote dados: Translate Datasets to Portuguese • dados
Creio que com o exemplo você conseguirá replicar o seu caso:
# carregando o dplyr
library(dplyr)
# instalando o pacote dados
# remotes::install_github("cienciadedatos/dados")
dados::dados_starwars %>%
# cria uma nova coluna chamada cabelo castanho, que:
dplyr::mutate(cabelo_castanho = dplyr::case_when(
# quando detectar o texto castanho na coluna cor_do_cabelo,
# deverá armazenar TRUE na coluna cabelo_castanho
stringr::str_detect(
string = cor_do_cabelo,
pattern = stringr::regex("castanho", ignore_case = TRUE)
) ~ TRUE,
# todos os outros casos (ou seja, que não foi encontrado o
# texto 'castanho' na coluna cor_do_cabelo) receberão
# o valor FALSE na coluna cabelo_castanho
TRUE ~ FALSE
)) %>%
dplyr::select(nome, cor_do_cabelo, cabelo_castanho)
#> # A tibble: 87 × 3
#> nome cor_do_cabelo cabelo_castanho
#> <chr> <chr> <lgl>
#> 1 Luke Skywalker Loiro FALSE
#> 2 C-3PO <NA> FALSE
#> 3 R2-D2 <NA> FALSE
#> 4 Darth Vader Nenhum FALSE
#> 5 Leia Organa Castanho TRUE
#> 6 Owen Lars Castanho, Cinza TRUE
#> 7 Beru Whitesun lars Castanho TRUE
#> 8 R5-D4 <NA> FALSE
#> 9 Biggs Darklighter Preto FALSE
#> 10 Obi-Wan Kenobi Ruivo, Branco FALSE
#> # … with 77 more rows
Created on 2021-10-25 by the reprex package (v2.0.1)
Segue uma adaptação do seu código (é necessário checar, como não tenho a base não consegui reproduzir):
resposta8 <- flutter_videos_filtrada %>%
select(channelTitle, channelId) %>%
mutate(contem_palavra = dplyr::case_when(
stringr::str_detect(
string = channelTitle,
pattern = stringr::regex("flutter", ignore_case = TRUE)
) ~ TRUE,
TRUE ~ FALSE
)) %>%
filter(contem_palavra = TRUE) %>%
group_by(channelTitle)
Abraços