R как изменить значение переменной на основе условия, используя dplyr :: mutate и if_else? - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь изменить значение переменной в data.frame, где, если условие выполняется, переменная принимает другое значение, а если условие не выполняется, переменная принимает свое первоначальное значение.Я запутался, почему получаю сообщение об ошибке, и хотел бы узнать, как я могу изменить свой код, чтобы устранить эту ошибку.

Например, скажем, у меня есть следующий набор данных x, и я хочу создатьновая переменная var3, такая, что если условие выполняется, var3 принимает 1, если нет, var3 принимает старое значение.

x = data.frame(var1 = c('a', 'b', 'ab'),
               var2 = rep(2,3))
x
x %>%
  dplyr::mutate(var3 = 0,
                var3 = if_else(grep('a', var1)==1, 1, var3))

Если я запускаю этот код, я получаю следующую ошибку

Error in mutate_impl(.data, dots) : 
  Column `var3` must be length 3 (the number of rows) or one, not 2

Правильный ответ

  var1 var2 var3
1    a    2    1
2    b    2    0
3   ab    2    1

Мой реальный код более сложен, и мне нужноvar3, чтобы принять его старое значение, когда условие оценивает FALSE, а не просто единичное значение (скажем, 0).

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Ответ с использованием str_detect:

library(tidyverse)

x = data.frame(var1 = c('a', 'b', 'ab'),
               var2 = rep(2,3))
x

x %>%
    dplyr::mutate(var3 = 0,
                  var3 = if_else(str_detect(var1,'a'), 1, var3))
0 голосов
/ 25 ноября 2018

Вы должны использовать grepl:

x %>%
  mutate(var3 = 0, 
         var3 = if_else(grepl('a', var1), 1, var3))

Выход:

  var1 var2 var3
1    a    2    1
2    b    2    0
3   ab    2    1

Причина в том, что grep дает вам только индексы истинных совпадений, а grepl выводитTRUE или FALSE для каждого значения вектора, что позволяет использовать его с ifelse (и в целом в рамках данных).

...