2010-08-22 5 views
15

Ich bin mir nicht sicher, wie ich das sonst noch fragen soll, aber ich möchte nach einem Begriff in mehreren String-Elementen suchen. Hier ist, was mein Code aussieht (aber falsch):Was ist das R-Äquivalent von SQL LIKE 'description%' Anweisung?

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

des ist ein Vektor, der Zeichenketten wie "Swinging Schlag", "Im Play (run (e))", „Im Spiel speichert (out (s) aufgezeichnet) und usw. Was ich im Spiel speichern möchte, ist ein 1s und 0s Vektor, der dem des Vektor entspricht, wobei die 1s im Spiel anzeigt, dass der Wert "In play%" drin ist und sonst 0s.

Ich glaube, die dritte Zeile ist falsch, weil all dies einen Vektor von 0s mit einer 1 im letzten Element zurückgibt.

Vielen Dank im Voraus!

+0

Sie wollen 'startsWith'? –

Antwort

14

Die R analog zu LIKE SQLs ist nur gewöhnliche Indizierung Syntax des R.

Das ‚LIKE‘ Bediener wählt Datenzeilen aus einer Tabelle von Zeichenfolgenwert in einer bestimmten Spalte gegen ein vom Benutzer bereitgestellte Mustern

> # 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 passenden, das wäre:

SELECT * FROM dfx WHERE Colors LIKE ptn3 
+0

Warum wrappst du 'grep()' mit 'fnx'? – Vince

+0

Ich hatte ursprünglich eine Funktion im Sinn, die den Datenrahmen als Argument und nicht nur als 1D-Vektor verwendet. In jedem Fall bearbeitet, um den Funktions-Wrapper zu entfernen. – doug

+0

Dies funktioniert, aber angenommen, ich möchte eine 1 in Vektor inplay speichern, wenn die Zeilennummer in ndx enthalten ist, und sonst eine 0, wobei die Länge der Vektoranzeige die Länge von dfx ist. Wie gehe ich vor? Ich spiele mit IF und ELSE-Anweisungen, aber ich bekomme das nicht zur Arbeit. Danke im Voraus! –

2

Etwas wie 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 
> 

oder grep

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

Die data.tablepackage hat Syntax, die oft similar to SQL ist. Das Paket enthält , die eine "Komfortfunktion zum Aufrufen von Regexpr" ist. Hier ist ein Beispiel aus der Hilfedatei:

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