if
и else
должны использоваться при логических условиях длины 1. Вы спрашиваете, равен ли вектор (OldTimeColumn
) некоторой длины n
вектору одного значения TRUE
- вот почему предупреждающее сообщение говорит о том, что оно говорит, и оно оценивает только первый элемент OldTimeColumn
, сравнивая его с TRUE
.
Лучшим способом для вашего конкретного примера может быть использованиеcase_when
структура.
library(dplyr)
library(stringr)
df <- data.frame(
OldTimeColumn = c("12", "1", "2", "3", "4"),
stringsAsFactors = F
)
df <- df %>%
mutate(NewTimeColumn = case_when(
str_detect(OldTimeColumn, "^12") ~ "12",
str_detect(OldTimeColumn, "^1") ~ "1",
str_detect(OldTimeColumn, "^2") ~ "2",
str_detect(OldTimeColumn, "^3") ~ "3",
TRUE ~ "11"
))
df
OldTimeColumn NewTimeColumn
1 12 12
2 1 1
3 2 2
4 3 3
5 4 11
Попытка сделать это с ifelse
(которая работает с оценкой векторов) будет более громоздкой, но может быть выполнена:
df <- df %>%
mutate(NewTimeColumn = ifelse(str_detect(OldTimeColumn, "^12") == TRUE,
"12", ifelse(str_detect(OldTimeColumn, "^1") == TRUE,
"1", ifelse(str_detect(OldTimeColumn, "^2") == TRUE,
"2", ifelse(str_detect(OldTimeColumn, "^3") == TRUE, "3", "11")))))