ifelse со списком возможных совпадений строк и не более - PullRequest
0 голосов
/ 28 сентября 2018

Обычно, если я хочу заполнить новый столбец данных $ new.col 1, если он находит строки «foo» или «bar» в data $ strings, и 0, если нет, я бы использовал что-то вроде этого:

data$new.col <- ifelse(grepl("foo|bar",
  data$strings, ignore.case = T, perl = T), "1", "0")

Однако я хочу сделать эквивалент этого без "else".Я пытался использовать простое задание, но я должен делать что-то не так, потому что оно не работает:

data$new.col[data$strings == "foo|bar"] <- "1"

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

Это почти однострочник, использующий пакет tidyverse:

library(tidyverse)
data(mpg)
df <-
  mpg %>% 
  select(manufacturer, displ) %>% 
  mutate(new_var = if_else(str_detect(manufacturer, "audi|chev"), 1, 0))

Команда if_else является векторизованной операцией, которая устраняет необходимость в поднаборах.

0 голосов
/ 28 сентября 2018

Попробуйте data$new.col[data$strings %in% c("foo", "bar")] <- "1"

Почему ваш код не работает:

Используя условие data$strings == "foo|bar", вы соответствуете(уникальная) строка "foo|bar", не с "foo" или "bar".Оператор %in% позволяет сопоставить любой элемент в векторе c("foo", "bar")

0 голосов
/ 28 сентября 2018

Или попробуйте

data$new.col <- as.integer(grepl("foo|bar",
                                  data$strings,
                                  ignore.case = T,
                                  perl = T))

Поскольку grepl возвращает логический вектор, все, что вам нужно сделать, это преобразовать его в числа.Оберните это выражение в as.character, если хотите строки.

0 голосов
/ 28 сентября 2018

Вам необходимо отредактировать условие фильтра следующим образом:

data$new.col[data$strings == "foo" | data$strings == "bar"] <- "1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...