2010-08-22 27 views
15

No estoy seguro de qué otra manera preguntar esto, pero quiero buscar un término dentro de varios elementos de cadena. Esto es lo que mi código es el siguiente (pero mal):¿Cuál es el equivalente R de la declaración LIKE 'description%' de 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 es un vector que almacena cadenas como "Swinging Strike", "en juego (RUN (s))", "en juego (fuera (s) grabado) "y etc. Lo que quiero almacenar es un vector 1s y 0s correspondiente con el vector des, con los 1s en el juego indicando que el valor des tiene" In play% "en él y 0s en caso contrario.

Creo que la tercera línea es incorrecta, porque todo lo que hace es devolver un vector de 0 con un 1 en el último elemento.

¡Gracias de antemano!

+0

¿Quiere 'startsWith'? –

Respuesta

14

El R análogo a como la de SQL es sólo la sintaxis de indexación ordinaria de R.

El 'como' operador selecciona filas de datos de una tabla de búsqueda de valores de cadena en una columna especificada contra un patrón suministrado por el usuario

> # 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 

En SQL, que sería:

SELECT * FROM dfx WHERE Colors LIKE ptn3 
+0

¿Por qué envuelve 'grep()' con 'fnx'? – Vince

+0

Originalmente tenía en mente una función que tomaba el marco de datos como argumento, en lugar de solo un vector 1D. En cualquier caso, editado para eliminar el contenedor de funciones. – doug

+0

Esto funciona, pero supongamos que quiero almacenar un 1 en el vector en juego si el número de fila está contenido en ndx, y un 0 en caso contrario, donde la longitud del vector de entrada es la longitud de dfx. ¿Cómo hago esto? Estoy jugando con instrucciones IF y ELSE, pero no estoy logrando que esto funcione. ¡Gracias por adelantado! –

2

Algo así como 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

El data.tablepackage tiene una sintaxis que a menudo es similar to SQL. El paquete incluye %like%, que es una "función de conveniencia para llamar a regexpr". Aquí hay un ejemplo tomado de su archivo de ayuda:

## 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 
Cuestiones relacionadas