With regex flavourregex:
# If sorting doesn't matter: gsub("(.)(?=.*\\1)|,| ", "", paste(df$V1, df$V2), perl = TRUE) # [1] "AB" "A" "AB" "A" "BAC" "AB" "A" "C" # With stringi: library(stringi) stri_extract_all(paste(df$V1, df$V2), regex = "[A-Z]") |> sapply(\(x) paste0(sort(unique(x)), collapse = "")) # [1] "AB" "A" "AB" "A" "ABC" "AB" "A" "C"