Eu tenho que filtrar um quadro de dados usando como critério a linha na qual está a string RTB
.
Estou usando dplyr
.
d.del <- df %.%
group_by(TrackingPixel) %.%
summarise(MonthDelivery = as.integer(sum(Revenue))) %.%
arrange(desc(MonthDelivery))
Eu sei que posso usar a função filter
, dplyr
mas não sei exatamente como pedir para verificar o conteúdo de uma string.
Em particular, quero verificar o conteúdo da coluna TrackingPixel
. Se a string contiver o rótulo RTB
, desejo remover a linha do resultado.
dplyr
, mas olhando para a ajuda em?dplyr::filter
eu sugerir algo comofilter(df, !grepl("RTB",TrackingPixel))
talvez?RTB
e não mostrar as outras.!
frentegrepl
- tente novamente.invert
evalue
degrep
. Expressões regulares tornam o trabalho com texto mil vezes mais fácil.grepl
não funciona no postgres para mim, é para o MySQL?Respostas:
A resposta para a pergunta já foi postada pelo @latemail nos comentários acima. Você pode usar expressões regulares para o segundo e argumentos subsequentes
filter
como este:Como você não forneceu os dados originais, adicionarei um exemplo de brinquedo usando o
mtcars
conjunto de dados. Imagine que você só está interessado em carros produzidos pela Mazda ou Toyota.Se você quiser fazer o contrário, excluindo carros Toyota e Mazda, o
filter
comando será assim:fonte
mtcars$`my type` <- rownames(mtcars)
e depoismtcars %>% filter(grepl('Toyota|Mazda', `my type`))
tbl_sql
comogrepl
não se traduz em sql.Solução
É possível usar
str_detect
ostringr
pacote incluído notidyverse
pacote.str_detect
retornaTrue
ouFalse
se o vetor especificado contém alguma sequência específica. É possível filtrar usando esse valor booleano. Veja Introdução ao stringr para detalhes sobre ostringr
pacote.As coisas boas sobre Stringr
Devemos usar ao
stringr::str_detect()
invés debase::grepl()
. Isso ocorre porque existem os seguintes motivos.stringr
pacote começam com o prefixostr_
, o que facilita a leitura do código.stringr
pacote é sempre o data.frame (ou valor), depois vêm os parâmetros (obrigado Paolo)Referência
Os resultados do teste de benchmark são os seguintes. Para dataframe grande,
str_detect
é mais rápido.fonte
stringr
pacote começam com o prefixo str_, que facilita a leitura do código. No código R moderno e recente, é recomendável usar stringr.base R
é tão bom quantostringr
. Se você nos fornecer alguns "fatos concretos", como o benchmarking, e não apenas declarar "é recomendado" (quem o recomenda?), Isso seria muito apreciado. GraçasEsta resposta é semelhante a outras, mas usando o preferido
stringr::str_detect
e o dplyrrownames_to_column
.Criado em 26/06/2018 pelo pacote reprex (v0.2.0).
fonte
str_detect
está nostringr
pacoteeditar incluiu a
across()
sintaxe mais recenteAqui está outra
tidyverse
solução, usandofilter(across())
ou anteriormentefilter_at
. A vantagem é que você pode estender facilmente para mais de uma coluna .Abaixo também uma solução com a
filter_all
fim de encontrar a string em qualquer coluna, usandodiamonds
como exemplo, procurando a string "V"String em apenas uma coluna
A sintaxe agora substituída para o mesmo seria:
String em todas as colunas:
A sintaxe agora substituída para o mesmo seria:
Tentei encontrar uma alternativa alternativa para o seguinte, mas não encontrei imediatamente uma boa solução:
Atualização: Obrigado ao usuário Petr Kajzar nesta resposta , aqui também uma abordagem para o acima:
fonte