Nao estou conseguindo usar o pacote stringr para eliminar linhas

Boa tarde!

Estou tentando eliminar da minha base as linhas que, na coluna Username, nao possuam um Username de fato, mas sim algum bug.

Para isso, criei um vetor com expressoes que iniciam os bugs que aparecem.

string_errors <- c("--","#","Failed at:","==","components:", 
              "layout:","y:","childAlignment:","size:", 
              " name"," id"," not","\t-",
              "FTL "," (myOptionalVar.foo)??",
              "Tip:","- Reached through:")

E então, eu faço um filtro para eliminar essas linhas linhas

user_log <- user_log %>%
  filter(Username != str_detect(Username, string_errors))

Entretanto, apenas algumas linhas estão sendo eliminadas. Muitas outras que possuem pelo menos uma das expressoes do vetores, estão sendo mantidas. O que será que estou fazendo de errado?

Obrigado!

Oi Kaique!

Eu costumo usar o str_detect de outra forma dentro do filter. Em vez de passar um vetor, eu ofereço uma única string que contém todas as regras de filtragem, separadas por um OU |. Você pode fazer isso colando o seu vetor e experimentar se o filtro funciona:

string_errors <- c("--","#","Failed at:","==","components:", 
                   "layout:","y:","childAlignment:","size:", 
                   " name"," id"," not","\t-",
                   "FTL "," (myOptionalVar.foo)??",
                   "Tip:","- Reached through:")

stringr::str_c(string_errors, collapse = "|")
#> [1] "--|#|Failed at:|==|components:|layout:|y:|childAlignment:|size:| name| id| not|\t-|FTL | (myOptionalVar.foo)??|Tip:|- Reached through:"

Created on 2022-03-18 by the reprex package (v2.0.1)

Exemplo de uso (adaptando seu código):

user_log <- user_log %>%
  filter(!str_detect(Username, 
stringr::str_c(string_errors, collapse = "|")))

Outra sugestão que dou é usar a função stringr::str_view_all() para investigar se as suas regras da Regex estão funcionando. Eu só uso essa função para investigar mesmo, depois de arrumar as regras não é necessário mais usá-la.

Exemplo com outra base:

library(dados)
stringr::str_view_all(pixar_filmes$filme,
 "Toy|Carros|Incríveis")

Essa função abre o painel Viewer e mostra o vetor escolhido, e tudo que atende a regra fica destacado:

Caso essa resposta não resolva, ficaria mais fácil se você enviasse um exemplo dos dados (pode ser apenas um vetor com exemplos dos valores que você quer remover).

Abraços!

Oi Bia, obrigado pelo retorno viu?! Infelizmente não deu certo =/

Aqui está a base para você dar uma olhada: https://drive.google.com/file/d/1-Ps_aKMG31MWyU-sm-nIu6CKqAJEd_e3/view?usp=sharing

O código usado:

user_log ← read.csv(“ALL_LOGS.csv”)

string_errors ← c(“–”,“#”,“Failed at:”,“==”,“components:”,
“layout:”,“y:”,“childAlignment:”,“size:”,
" name"," id"," not",“\t-”,
“FTL “,” (myOptionalVar.foo)??”,
“Tip:”,“- Reached through:”)

user_log ← user_log %>%
mutate(Timestamp = ymd_hms(Timestamp), Projeto = NA,
Action_Name = NA, Input = NA) %>%
filter(Username != str_detect(Username, str_c(string_errors, collapse = “|”))) %>% #Retirando as linhas que contém erros em Username

#Criando uma tibble para verificar se os users estão corretos
user_log2 ← user_log %>%
select(Username) %>%
mutate(Action_Count = 1) %>%
group_by(Username) %>%
summarise(Action_Count = sum(Action_Count))

Aqui, o resultado com os bugs:

@kaiquemancoso
Veja se dessa forma funciona… Não é a maneira mais astuta, mas espero que dê certo.

library(tidyverse)

logs <- read_csv("data.frame/ALL_LOGS.csv")
glimpse(logs)

# String com os padroes de erro
string_errors <- c("--","#","Failed at:","==","components:", 
                   "layout:","y:","childAlignment:","size:", 
                   " name"," id"," not","\t-",
                   "FTL "," (myOptionalVar.foo)??",
                   "Tip:","- Reached through:")

# Flag das linhas com erro
logs <- logs %>% 
  mutate(errorUsenames = 0 %>% if_else(str_detect(Username, str_c(string_errors, collapse = "|")), 1,.))

# Remoção das linhas com erro
logs <- logs %>% filter(errorUsenames == 0) %>% 
  select(-errorUsenames)

# Contagem
logs %>% 
  group_by(Username) %>% count() 

Abraços

Kaique,

Acho que o código está com um problema: a função filter() espera um valor TRUE ou FALSE para cada linha, determinando se ela deve continuar na base ou não. Isso quer dizer que você só precisa usar a str_detect(), sem esse Username != ; com ele você só vai manter as linhas em que o nome do usuário é diferente do TRUE ou FALSE retornado pela str_detect(), jogando fora todo o seu trabalho de detecção. Por fim, como comentado pela @beatrizmilz, também vamos usar o | para juntar todas as verificações em uma só expressão.

library(tidyverse)

# Erros
string_errors <- c(
  "--","#","Failed at:","==","components:", 
  "layout:","y:","childAlignment:","size:", 
  " name"," id"," not","\t-",
  "FTL "," (myOptionalVar.foo)??",
  "Tip:","- Reached through:"
)

# Uma expressão só
padrao <- str_c(string_errors, collapse = "|")

# Manter
!str_detect("harpreet", padrao)
#> [1] TRUE

# Jogar fora
!str_detect("Tip: It's the step after the last", padrao)
#> [1] FALSE

# Vamos remover 
"~/Downloads/ALL_LOGS.csv" %>% 
  read_csv() %>% 
  filter(!str_detect(Username, padrao))
#> # A tibble: 7,517 × 4
#>    Username   Timestamp         Action             Status
#>    <chr>      <chr>             <chr>              <chr> 
#>  1 teras      20211222-16:22:08 /projects          OK    
#>  2 muhammad   20211223-12:21:55 /projects          OK    
#>  3 kaique     20211223-12:39:45 /projects          OK    
#>  4 kaique     20211223-12:39:51 /project/create    OK    
#>  5 kaique     20211223-12:39:54 /projects          OK    
#>  6 kaique     20211223-12:41:43 /project/delete/60 OK    
#>  7 kaique     20211223-12:41:43 /projects          OK    
#>  8 kaique     20211223-12:41:45 /project/delete/59 OK    
#>  9 kaique     20211223-12:41:45 /projects          OK    
#> 10 lucasgomes 20211227-03:23:49 /projects          OK    
#> # … with 7,507 more rows

Created on 2022-03-19 by the reprex package (v2.0.1)

Galera, deu certo demais! Muito obrigado!!! Vocês são feras