R, использующий dplyr::mutate с ifelse, содержащим grepl(), дает неожиданный результат

#r #if-statement #dplyr #grepl

#r #оператор if #dplyr #grepl

Вопрос:

Что не так с этим оператором ifelse.

 df <- data.frame(var1=c('ABC','CAB', 'AB'))
dplyr::mutate(df, var2=ifelse(grepl('^AB',var1), 'AB-starter', var1))
 

Дает

   var1       var2
1  ABC AB-starter
2  CAB          3
3   AB AB-starter
 

Я хотел (используя оператор mutate и ifelse) значение var1 во втором элементе var2 (то есть, когда ‘var1’ не начинается с «AB»):

   var1       var2
1  ABC AB-starter
2  CAB        CAB
3   AB AB-starter
 

Ответ №1:

Поскольку ‘var1’ является a factor , он преобразуется к целочисленному значению внутри ifelse . Мы можем избежать этого, as.character

 mutate(df, var2=ifelse(grepl('^AB',var1), 'AB-starter', as.character(var1)))
 

или при создании data.frame , используйте stringsAsFactors=FALSE

Комментарии:

1. Ах! Я думал, что уже проверял эту возможность (stringsAsFactors=F), но у меня было неправильное имя переменной в этой строке. Оказывается, что после операции плавления (в моих реальных данных) фактор вернулся.