2013-08-21 2 views
0

У меня возникают проблемы группировки и суммирования follwing данных в R:R агрегированные данные по определению группировки

category freq 
1 C1  9 
2 C2 39 
3 C3  3 
4 A1 38 
5 A2  2 
6 A3 29 
7 B1 377 
8 B2 214 
9 B3 790 
10 B4 724 
11 D1 551 
12 D2 985 
13 E5 19 
14 E4 28 

выглядеть следующим образом:

category freq 
1 A 69 
2 B 2105 
3 C 51 
4 D 1536 
5 E 47 

Я обычно использую ddply агрегировать данные по , но это просто добавляет все строки значений с тем же атрибутом в данном столбце. Мне нужно указать несколько атрибутов, которые должны быть объединены в одну категорию.

+0

Пожалуйста, обратите внимание на мой модифицированный ответ. Я включил полный пример, а также то, как будет выглядеть вывод. – Mayou

ответ

2

Почему вы не добавляете столбец в ваш фреймворк данных, это будет буквальная часть столбца «Категория». Затем вы можете использовать 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 
+0

Данные, перечисленные мной, были просто примером, но мне действительно нужно определить случаи, когда что-то вроде KG, XM и L4 будет объединено в одну категорию. – Rick

+0

Не проблема. Позвольте мне соответствующим образом изменить свой ответ и вернуться к вам. – Mayou

+0

@Rick Пожалуйста, проверьте мой измененный ответ. Я заменил функцию 'substr' на' gsub', которая будет извлекать «алфавитную» часть столбца, независимо от того, какая длина имени каждой категории. – Mayou

Смежные вопросы