Вот один вариант, использующий основание R. Это разбивает столбец Code
на запятую (и хотя бы один пробел), затем подсчитывает количество раз, когда появляется первая буква, а затем вставляет их обратно в желаемый вывод. Он сортирует новый столбец в алфавитном порядке (что не соответствует вашему выводу). Надеюсь, это поможет!
test2$Coode_Count2 <- sapply(strsplit(test2$Code, ",\\s+"), function(x) {
tab <- table(substr(x, 1, 1)) # Create a table of the first letters
paste0(names(tab), tab, collapse = ", ") # Paste together the letter w/ the number and collapse them
} )
test2
Code Code_Count Coode_Count2
1 EKST, STFO E1, S1 E1, S1
2 EFGG E1 E1
3 SSGG, RRRR, RRFK S1, R2 R2, S1
4 RRRF R1 R1
Вот более точное решение, stringr
/ purrr
, которое захватывает первую букву слова и делает то же самое (вместо разбиения строки)
library(purrr)
library(stringr)
map_chr(str_extract_all(test2$Code, "\\b[A-Z]{1}"), function(x) {
tab <- table(x)
paste0(names(tab), tab, collapse = ", ")
} )
Данные :
test2 <- data.frame("Code" = c("EKST, STFO", "EFGG", "SSGG, RRRR, RRFK",
"RRRF"), "Code_Count" = c("E1, S1", "E1", "S1, R2", "R1"))
test2[] <- lapply(test2, as.character) # factor to character