Here is one approach:
library(tidyverse)
df <- tibble(ID = 1:200,
brand = sample(c("Brand A", "Brand B", "Brand C",
"Brand M", "Brand N", "Brand O",
"Brand X", "Brand Y", "Brand Z"),
size = 200, replace = TRUE))
df
# A tibble: 200 x 2
# ID brand
# <int> <chr>
# 1 1 Brand X
# 2 2 Brand M
# 3 3 Brand A
# 4 4 Brand N
# 5 5 Brand M
# 6 6 Brand B
# 7 7 Brand X
# 8 8 Brand B
# 9 9 Brand N
# 10 10 Brand O
# … with 190 more rows
df_grouped <- df %>%
mutate(brand_group = case_when(brand %in% c("Brand A", "Brand B", "Brand C") ~ "A",
brand %in% c("Brand M", "Brand N", "Brand O") ~ "M",
brand %in% c("Brand X", "Brand Y", "Brand Z") ~ "Z"))
df_grouped
# A tibble: 200 x 3
# ID brand brand_group
# <int> <chr> <chr>
# 1 1 Brand X Z
# 2 2 Brand M M
# 3 3 Brand A A
# 4 4 Brand N M
# 5 5 Brand M M
# 6 6 Brand B A
# 7 7 Brand X Z
# 8 8 Brand B A
# 9 9 Brand N M
# 10 10 Brand O M
# … with 190 more rows
df_int <- df_grouped %>%
mutate(brand_int = ifelse(brand_group == "A", 1, ifelse(brand_group == "M", 2, 3)))
df_int
# A tibble: 200 x 4
# ID brand brand_group brand_int
# <int> <chr> <chr> <dbl>
# 1 1 Brand X Z 3
# 2 2 Brand M M 2
# 3 3 Brand A A 1
# 4 4 Brand N M 2
# 5 5 Brand M M 2
# 6 6 Brand B A 1
# 7 7 Brand X Z 3
# 8 8 Brand B A 1
# 9 9 Brand N M 2
# 10 10 Brand O M 2
# … with 190 more rows
Edit
You can also use case_when()
to change the original brand to an integer in a single step, e.g.
df_int <- df %>%
mutate(brand_int = case_when(brand %in% c("Brand A", "Brand B", "Brand C") ~ 1,
brand %in% c("Brand M", "Brand N", "Brand O") ~ 2,
brand %in% c("Brand X", "Brand Y", "Brand Z") ~ 3))
df_int
# A tibble: 200 x 3
# ID brand brand_int
# <int> <chr> <dbl>
# 1 1 Brand X 3
# 2 2 Brand M 2
# 3 3 Brand A 1
# 4 4 Brand N 2
# 5 5 Brand M 2
# 6 6 Brand B 1
# 7 7 Brand X 3
# 8 8 Brand B 1
# 9 9 Brand N 2
# 10 10 Brand O 2
# … with 190 more rows
Or, if you want to replace the brand with the integer in the same column, you can use transmute()
e.g.
df_int <- df %>%
transmute(brand_int = case_when(brand %in% c("Brand A", "Brand B", "Brand C") ~ 1,
brand %in% c("Brand M", "Brand N", "Brand O") ~ 2,
brand %in% c("Brand X", "Brand Y", "Brand Z") ~ 3))
df_int
# A tibble: 200 x 1
# brand_int
# <dbl>
# 1 3
# 2 2
# 3 1
# 4 2
# 5 2
# 6 1
# 7 3
# 8 1
# 9 2
# 10 2
# … with 190 more rows