Thank you so much for the prompt reply. It works ...
May I ask how to manage the case where the reqts are multi-word seperated by comma
structure(list(customer = c("Alpha", "Beta"), reqts = c("beauty soap, hair shampoo",
"hair shampoo, detergent, hand and body sanitizer")), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -2L), spec = structure(list(
cols = list(customer = structure(list(), class = c("collector_character",
"collector")), reqts = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"))
I tried as follows:
sample_df %>%
separate_rows(reqts,sep=",") %>%
count(reqts)
to get:
structure(list(reqts = c(" detergent", " hair shampoo", " hand and body sanitizer",
"beauty soap", "hair shampoo"), n = c(1L, 1L, 1L, 1L, 1L)), row.names = c(NA,
-5L), groups = structure(list(reqts = c(" detergent", " hair shampoo",
" hand and body sanitizer", "beauty soap", "hair shampoo"), .rows = structure(list(
1L, 2L, 3L, 4L, 5L), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))```
Or in another words:

Where it should be:
|beauty soap||1|
|hair shampoo||2|
|detergent||1|
|hand and body sanitizer||1|