Почему вы не добавляете столбец в ваш фреймворк данных, это будет буквальная часть столбца «Категория». Затем вы можете использовать ddply
.
Пример:
df = data.frame(id = c(1,2,3,4,5), category = c("AB1", "AB2", "B1", "B2", "B3"), freq = c(50,51,2,26))
df$new = as.factor(gsub("\\d", "", df$category))
Вы можете затем использовать ddply
на основе нового столбца, следующим образом:
library(plyr)
aggregate <- ddply(df, .(new), summarize, freq = sum(freq))
Вы получите следующий результат:
# new freq
#1 AB 101
#2 B 31
Это будет работать только если вы собираетесь группировать все категории с похожими " алфавитная "подстрока под одной и той же зоной категории.
Если, однако, вы хотите, чтобы группа пользовательских категорий под одной категории (ваш пример: KG, XM и L4 будет частью одной и той же категории), можно определить новые «супер» категории, и присвоить каждому подкатегории к соответствующей категории «супер». Один из способов, о котором я могу думать, - это функция switch
. Пожалуйста, смотрите пример ниже:
df = data.frame(id = c(1,2,3,4,5), category = c("A", "B", "KG", "XM", "L4"), freq = c(50,51,3,2,26))
fct <- function(cat) {switch(cat, "A" = "CAT1", "B" = "CAT2", "KG" = "CAT3", "XM" = "CAT3", "L4"="CAT3")}
df$new = as.factor(unlist(lapply(df$category, fct)))
aggregate <- ddply(df, .(new), summarize, freq = sum(freq))
Это даст вам:
# new freq
#1 CAT1 50
#2 CAT2 51
#3 CAT3 31
Пожалуйста, обратите внимание на мой модифицированный ответ. Я включил полный пример, а также то, как будет выглядеть вывод. – Mayou