R как использовать grep в операторе if

В R я хочу сделать то же, что и в операторе if, как в приведенном ниже примере, где я ищу любые цвета в столбце mix $ color, которые содержат слово красный, и устанавливаю для новой переменной в кадре данных mix красный цвет.

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

А вот несколько примеров данных для смеси фреймов данных:

АлисаСиний СинийФиолетовый ТемныйКрасный СреднийФиолетовыйКрасный

Я получаю это сообщение об ошибке:

Предупреждающее сообщение: в if (grepl ("deep red", mix $ color) == TRUE) "red": длина условия> 1, и будет использоваться только первый элемент.

Я думаю, что grepl должен возвращать логическое значение ИСТИНА или ЛОЖЬ, так что это должно быть приемлемо, но я что-то упускаю (или много).

Спасибо за вашу помощь.


person Jazzmine    schedule 07.02.2015    source источник
comment
Здесь вам понадобится векторизованный ifelse вместо обычных if и else. Вам также не нужно == true при использовании grepl.   -  person talat    schedule 07.02.2015
comment
Да, это сработало как чемпион. Раньше я рассматривал возможность использования ifelse, но был озадачен по поводу else, но я просто буду ссылаться на mix $ newcolor для else. Он будет либо пустым, либо иметь преобразованное значение. Спасибо.   -  person Jazzmine    schedule 07.02.2015
comment
Одним из преимуществ ifelse является то, что вы можете легко их вкладывать. Допустим, вы хотите преобразовать свой цветной вектор в чистые цвета: color = c("AliceBlue", "BlueViolet", "DarkRed", "MediumVioletRed", "DarkGreen"); ifelse(grepl("Red",color),"red",ifelse(grepl("Green",color),"green",ifelse(grepl("Blue",color),"blue","other")))   -  person xraynaud    schedule 07.02.2015


Ответы (2)


вы можете использовать grepl и оператор ifelse:

> color = c("AliceBlue", "BlueViolet", "DarkRed", "MediumVioletRed")
> ifelse(grepl("Red",color),"red","other")
[1] "other" "other" "red"  "red" 
person xraynaud    schedule 07.02.2015
comment
Спасибо, по сути, то, что предоставил доцент discimus, но с образцом кода. - person Jazzmine; 07.02.2015

Для этой задачи вам не нужны if или ifelse. Вы можете использовать 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" 

Команда sub заменяет все строки, включая подстроку "red", на "red". Кроме того, я указал ignore.case = TRUE для совпадений в верхнем и нижнем регистре.

person Sven Hohenstein    schedule 07.02.2015