2010-08-22 12 views
15

Non so in che altro modo chiedere questo, ma, voglio cercare un termine all'interno di diversi elementi stringa. Ecco ciò che il mio codice è simile (ma sbagliato):Qual è l'equivalente R dell'istruzione LIKE 'description%' di SQL?

inplay = vector(length=nrow(des)) 
for (ii in 1:nrow(des)) { 
if (des[ii] = 'In play%') 
    inplay[ii] = 1 
else inplay[ii] = 0 
} 

des è un vettore che memorizza le stringhe come la "Swinging Strike", "in gioco (run (s))", "in gioco (out (s) registrati "ed ecc. Ciò che voglio in attesa di memorizzare è un vettore 1s e 0s corrispondente al vettore des, con 1s in gioco che indica che il valore des ha" In riproduzione% "in esso e 0s altrimenti.

Credo che la terza riga non sia corretta, perché tutto ciò che fa è restituire un vettore di 0 con un 1 nell'ultimo elemento.

Grazie in anticipo!

+0

Si desidera 'startsWith'? –

risposta

14

R analogico SIMILE di SQL è solo sintassi indicizzazione ordinario R.

L'operatore 'COME' seleziona righe di dati da una tabella di corrispondenti valori di stringa in una colonna specificata contro un modello fornito dall'utente

> # create a data frame having a character column 
> clrs = c("blue", "black", "brown", "beige", "berry", "bronze", "blue-green", "blueberry") 
> dfx = data.frame(Velocity=sample(100, 8), Colors=clrs) 
> dfx 
      Velocity Colors 
     1  90  blue 
     2  94  black 
     3  71  brown 
     4  36  beige 
     5  75  berry 
     6  2  bronze 
     7  89 blue-green 
     8  93 blueberry 

> # create a pattern to use (the same as you would do when using the LIKE operator) 
> ptn = '^be.*?' # gets beige and berry but not blueberry 
> # execute a pattern-matching function on your data to create an index vector 
> ndx = grep(ptn, dfx$Colors, perl=T) 
> # use this index vector to extract the rows you want from the data frome: 
> selected_rows = dfx[ndx,] 
> selected_rows 
    Velocity Colors 
    4  36 beige 
    5  75 berry 

In SQL, che sarebbe:

SELECT * FROM dfx WHERE Colors LIKE ptn3 
+0

Perché impacchettiamo 'grep()' con 'fnx'? – Vince

+0

Inizialmente avevo in mente una funzione che considerava il frame dei dati come un argomento piuttosto che un vettore 1D. In ogni caso, modificato per rimuovere il wrapper di funzione. – doug

+0

Funziona, ma supponiamo di voler memorizzare un 1 in gioco in gioco se il numero di riga è contenuto in ndx, e uno 0 altrimenti, dove la lunghezza del vettore è la lunghezza di dfx. Come faccio a fare questo? Sto giocando con le istruzioni IF e ELSE, ma non riesco a farlo funzionare. Grazie in anticipo! –

2

Qualcosa come regexpr?

> d <- c("Swinging Strike", "In play (run(s))", "In play (out(s) recorded)") 
> regexpr('In play', d) 
[1] -1 1 1 
attr(,"match.length") 
[1] -1 7 7 
> 

o grep

> grep('In play', d) 
[1] 2 3 
> 
16

Lo data.tablepackage ha una sintassi che è spesso similar to SQL. Il pacchetto include %like%, che è una "funzione di comodità per chiamare regexpr". Ecco un esempio tratto dal suo file della guida:

## Create the data.table: 
DT = data.table(Name=c("Mary","George","Martha"), Salary=c(2,3,4)) 

## Subset the DT table where the Name column is like "Mar%": 
DT[Name %like% "^Mar"] 
##  Name Salary 
## 1: Mary  2 
## 2: Martha  4