Вместо нескольких if/else
или ifelse
или case_when
(что было бы более правильным вместо if/else
, поскольку ifelse
и case_when
векторизованы, тогда как if/else
ожидает вектор с length
1- поэтому нужно циклически перебирать строки вместо целого столбца) создать набор данных 'key / val' и выполнить объединение один раз
library(dplyr)
keyvaldat <- data.frame(factor_column = 1:6, col = c("red", "blue", "yellow",
"black", "pink", "green"), stringsAsFactors = FALSE)
left_join(df, keyvaldat) %>%
mutate(col = replace(col, is.na(col), "gray"))
# A tibble: 166 x 4
# x1 x2 factor_column col
# <int> <int> <dbl> <chr>
# 1 1 166 1 red
# 2 2 167 1 red
# 3 3 168 1 red
# 4 4 169 1 red
# 5 5 170 1 red
# 6 6 171 1 red
# 7 7 172 1 red
# 8 8 173 1 red
# 9 9 174 1 red
#10 10 175 1 red
# … with 156 more rows
Есть несколько способов сделать это, другой вариант сcase_when
.Обратите внимание, что с количеством элементов, которые нужно изменить, число операторов также увеличивается
df %>%
mutate(col = case_when(factor_column == 1 ~ "red",
factor_column == 2 ~ "blue",
factor_column == 3 ~ "yellow",
factor_column ==4 ~ "black",
factor_column == 5 ~ "pink",
factor_column == 6~ "green",
TRUE ~ "gray"))
Или с recode
df %>%
mutate(col = recode(factor_column, '1' = 'red', '2' = 'blue',
'3' = 'yellow', '4' = 'black', '5' = 'pink',
'6' = 'green', .default= 'gray'))
Или с использованием именованного вектора
df$col <- setNames(c("red", "blue", "yellow",
"black", "pink", "green"), 1:6)[as.character(df$factor_column)]
df$col[is.na(df$col)] <- "gray"