Correspondência de padrões usando um curinga

Como faço para identificar uma string usando um curinga?

Eu encontrei o glob2rx , mas não entendo como usá-lo. Eu tentei usar o código a seguir para escolher as linhas do quadro de dados que começam com a palavra blue :

 # make data frame a <- data.frame( x = c('red','blue1','blue2', 'red2')) # 1 result <- subset(a, x == glob2rx("blue*") ) # 2 test = ls(pattern = glob2rx("blue*")) result2 <- subset(a, x == test ) # 3 result3 <- subset(a, x == pattern("blue*") ) 

No entanto, nenhum desses funcionou. Não tenho certeza se devo usar uma function diferente para tentar fazer isso.

Se você quiser examinar elementos dentro de um dataframe, você não deve estar usando ls() que apenas analisa os nomes dos objects no espaço de trabalho atual (ou se usado dentro de uma function no ambiente atual). Rownames ou elementos dentro de tais objects não são visíveis para ls() (a menos que você adicione um argumento de ambiente à chamada ls(.) ). Tente usar o grep() que é a function workhorse para correspondência de padrões de vetores de caracteres:

 result <- a[ grep("blue", a$x) , ] # Note need to use `a$` to get at the `x` 

Se você quiser usar o subconjunto, considere que a function grepl() que está relacionada, e que retorna um vetor de lógicos, pode ser usada no argumento do subconjunto:

 subset(a, grepl("blue", a$x)) x 2 blue1 3 blue2 

Edit: Adicionando um uso "adequado" de glob2rx dentro de subconjunto ():

 result <- subset(a, grepl(glob2rx("blue*") , x) ) result x 2 blue1 3 blue2 

Acho que não entendi o glob2rx até voltar a essa questão. (Eu entendi as questões de escopo que eram a raiz das dificuldades do questionador. Qualquer um que ler isso deve agora rolar para baixo para responder a Gavin e upvote-lo.)

glob2rx() converte um padrão incluindo um curinga na expressão regular equivalente. Você precisa passar essa expressão regular para uma das ferramentas de correspondência de padrões de R.

Se você quer combinar "blue*" onde * tem o curinga usual, não a expressão regular, o que significa que usamos glob2rx() para converter o padrão curinga em uma expressão regular útil:

 > glob2rx("blue*") [1] "^blue" 

O object retornado é uma expressão regular.

Dados seus dados:

 x <- c('red','blue1','blue2', 'red2') 

podemos combinar padrões usando grep() ou ferramentas similares:

 > grx <- glob2rx("blue*") > grep(grx, x) [1] 2 3 > grep(grx, x, value = TRUE) [1] "blue1" "blue2" > grepl(grx, x) [1] FALSE TRUE TRUE FALSE 

Quanto ao problema de seleção de linhas que você postou

 > a <- data.frame(x = c('red','blue1','blue2', 'red2')) > with(a, a[grepl(grx, x), ]) [1] blue1 blue2 Levels: blue1 blue2 red red2 > with(a, a[grep(grx, x), ]) [1] blue1 blue2 Levels: blue1 blue2 red red2 

ou via subset() :

 > with(a, subset(a, subset = grepl(grx, x))) x 2 blue1 3 blue2 

Espero que isso explique o que o grob2rx() faz e como usá-lo?

Você está no caminho certo – a palavra-chave que você deve procurar no Google é Expressões Regulares. R suporta-os de forma mais direta do que isso usando grep() e algumas outras alternativas.

Aqui está uma discussão detalhada: http://www.regular-expressions.info/rlanguage.html

Se você realmente quiser usar curingas para identificar variables ​​específicas, use uma combinação de ls() e grep() seguinte maneira:

l = ls()
vars.with.result <- l[grep("result", l)]

Também é possível usar o pacote data.table e a function Like, detalhes fornecidos abaixo Como selecionar linhas R data.table com base na correspondência de substring (como no SQL)

Intereting Posts