Estou tentando usar grep
para testar se um vetor de seqüências de caracteres está presente em outro vetor ou não, e para gerar os valores que estão presentes (os padrões correspondentes).
Eu tenho um quadro de dados como este:
FirstName Letter
Alex A1
Alex A6
Alex A7
Bob A1
Chris A9
Chris A6
Eu tenho um vetor de padrões de cordas de ser encontrado nas colunas da "letra", por exemplo: c("A1", "A9", "A6")
.
Gostaria de verificar se alguma das cadeias no vetor padrão está presente na coluna "Carta". Se forem, eu gostaria da saída de valores únicos.
O problema é que não sei usar grep
com vários padrões. Eu tentei:
matches <- unique (
grep("A1| A9 | A6", myfile$Letter, value=TRUE, fixed=TRUE)
)
Mas me dá 0 correspondências, o que não é verdade, alguma sugestão?
fixed=TRUE
porque seu padrão é uma expressão regular verdadeira .match
ou%in%
ou até==
é a única maneira correta de comparar correspondências exatas. regex é muito perigoso para essa tarefa e pode levar a resultados inesperados.Respostas:
Além do comentário de @ Marek sobre não incluir
fixed==TRUE
, você também não precisa ter os espaços em sua expressão regular. Deveria ser"A1|A9|A6"
.Você também mencionou que existem muitos padrões. Supondo que eles estejam em um vetor
Em seguida, você pode criar sua expressão regular diretamente usando
paste
ecollapse = "|"
.fonte
toMatch %in% myfile$Letter
?Boas respostas, no entanto, não se esqueça
filter()
do dplyr:fonte
grepl
funciona com um padrão por vez (precisamos de vetor com comprimento 1), temos 3 padrões (vetor com comprimento 3), para que possamos combiná-los com um usando alguns amigáveis para separador grepl -|
, tente sua sorte com outros :))|(
a padrões separadas pode tornar isso mais robusto:paste0("(", paste(patterns, collapse=")|("),")")
. Infelizmente, também se torna um pouco menos elegente. Isso resulta em padrão(A1)|(A9)|(A6)
.Isso deve funcionar:
Ou ainda mais simplesmente:
fonte
%like%
não está na base R, portanto, você deve mencionar quais pacotes são necessários para usá-lo.%like%
faz parte dodata.table
pacote. Também em semelhantesdata.table
sãolike(...)
,%ilike%
e%flike%
.Com base na publicação de Brian Digg, aqui estão duas funções úteis para filtrar listas:
fonte
Você já tentou as funções
match()
oucharmatch()
?Exemplo de uso:
fonte
match
é que ele não está usando padrões, está esperando uma correspondência exata.Não tenho certeza se esta resposta já apareceu ...
Para o padrão específico da pergunta, você pode fazer isso com uma única
grep()
chamada,fonte
Para adicionar à resposta de Brian Diggs.
de outra maneira, usando grepl retornará um quadro de dados contendo todos os seus valores.
Talvez um pouco mais limpo ... talvez?
fonte
Tire os espaços. Então faz:
fonte
Usando o
sapply
fonte
Sugiro escrever um pequeno script e fazer várias pesquisas com o Grep. Eu nunca encontrei uma maneira de procurar vários padrões e, acredite, já procurei!
Assim, seu arquivo shell, com uma string incorporada:
Em seguida, execute digitando myshell.sh.
Se você quiser passar a string na linha de comando, faça o seguinte, com um argumento shell - esta é a notação bash btw:
E assim por diante.
Se houver muitos padrões para combinar, você pode colocá-lo em um loop for.
fonte