2015-02-07 18 views
11

W języku RI chcesz zrobić coś takiego w instrukcji if, jak na poniższym przykładzie, w którym szukam kolorów w kolumnie mix $ color, które zawierają słowo red i ustawiają nową zmienną w mieszanej ramce danych do koloru czerwonego.R jak używać polecenia grep, jeśli instrukcja

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

A oto kilka przykładowych danych dla mieszanki dataframe:

AliceBlue BlueVioletcolor darkred MediumVioletRed

Dostaję komunikat o błędzie: Komunikat

Ostrzeżenie : W przypadku (grepl ("deep red", mix $ co lor) == true) „czerwony”: warunek ma długość> 1 i tylko pierwszy element będzie używany

myślę że Grepl należy powrocie prawdziwą lub fałszywą wartość logiczną tak że powinno być dopuszczalne, ale ja "czegoś mi brakowało (lub dużo).

Dzięki za pomoc.

+3

Potrzebujesz tu wektoryzowanego 'ifelse' zamiast normalnego, jeśli i jeszcze innego. Nie potrzebujesz również == true, gdy używasz grepl. –

+0

Tak, to działało jak mistrz. Zastanawiałem się nad użyciem ifelse wcześniej, ale zostałem zakwestionowany w innej części, ale powiem tylko mix $ newcolor dla innego. Będzie albo puste, albo ma wartość przekonwertowaną. Dzięki. – Jazzmine

+1

Jedną z zalet ifelse jest to, że można je łatwo zagnieździć. Powiedzmy, że chcesz przekształcić swój wektor koloru w "czyste" kolory: 'color = c (" AliceBlue "," BlueViolet "," DarkRed "," MediumVioletRed "," DarkGreen "); ifelse (grepl ("czerwony", kolor), "czerwony", ifelse (grepl ("zielony", kolor), "zielony", ifelse (grepl ("niebieski", kolor), "niebieski", "inny"))) ' – xraynaud

Odpowiedz

14

można użyć Grepl oraz ifelse oświadczenie:

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

Dziękuję, w gruncie rzeczy, co docent discimus podał, ale z przykładowym kodem. – Jazzmine

3

Nie trzeba if lub ifelse dla tego zadania. Można użyć sub:

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" 

Komenda sub zastępuje wszystkie sznurki w tym podciągu "red" z "red". Ponadto podałem ignore.case = TRUE dla dopasowań wielkich i małych liter.