2015-02-07 10 views
11

In RI möchte ich ein like in einer if-Anweisung wie im Beispiel unten machen, wo ich nach Farben in der mix $ color-Spalte suche, die das Wort red enthalten und eine neue Variable setzen im Mixdatenrahmen an die Farbe rot.R Wie benutze ich grep in if-Anweisung

mix$newcolor <- if(grep("Red",mix$color) "red"

Und hier einige Beispieldaten für den Datenrahmen-Mix:

Aliceblue Blueviolet DarkRed MediumVioletRed

Ich bekomme diese Fehlermeldung:

Warnmeldung : In if (grepl ("tiefrot", mix $ co lor) == TRUE) „rot“: hat die Bedingung Länge> 1 und nur das erste Element wird verwendet

Ich denke, dass Grepl einen WAHR oder FALSCH boolean Wert zurückgegeben werden soll, so dass akzeptabel sein sollte, aber ich Ich vermisse etwas (oder viel).

Danke für Ihre Hilfe.

+3

Sie benötigen hier die vektorisierte 'ifelse' anstelle der normalen if und else. Sie brauchen auch nicht == true, wenn Sie grepl verwenden. –

+0

Ja, das hat wie ein Champion funktioniert. Ich hatte schon einmal darüber nachgedacht, ifelse zu verwenden, aber ich war auf dem else-Teil ratlos, aber ich werde nur Mix $ newcolor für den else referenzieren. Es wird entweder leer sein oder einen konvertierten Wert haben. Vielen Dank. – Jazzmine

+1

Ein Vorteil von ifelse ist, dass Sie sie einfach verschachteln können. Nehmen wir an, Sie möchten Ihren Farbvektor in "reine" Farben umwandeln: 'color = c (" AliceBlue "," BlueViolet "," DarkRed "," MediumVioletRed "," DarkGreen "); ifelse (grepl ("Rot", Farbe), "rot", ifelse (grepl ("Grün", Farbe), "grün", ifelse (grepl ("Blau", Farbe), "Blau", "andere"))) ' – xraynaud

Antwort

14

können Sie Grepl und eine ifelse Anweisung:

> color = c("AliceBlue", "BlueViolet", "DarkRed", "MediumVioletRed") 
> ifelse(grepl("Red",color),"red","other") 
[1] "other" "other" "red" "red" 
+0

Danke, im Wesentlichen, was Docent Discimus aber mit Beispielcode zur Verfügung gestellt hatte. – Jazzmine

3

Sie nicht if oder ifelse für diese Aufgabe brauchen. Sie können sub verwenden:

color <- c("darkred", "indianred", "violetred", "deep red", 
      "Orange Red", "blue", "yellow") 

sub(".*red.*", "red", color, ignore.case = TRUE) 
# [1] "red" "red" "red" "red" "red" "blue" "yellow" 

Der sub Befehl ersetzt alle Strings einschließlich der Teilkette "red" mit "red". Außerdem habe ich ignore.case = TRUE für Groß- und Kleinbuchstaben angegeben.