Я пытаюсь изменить значение переменной в 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).
Что я здесь делаю не так?





Вам следует использовать 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 (и в рамках фреймов данных в целом).
Ответ с помощью 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))