2015-09-07 5 views
3

Я пытаюсь запустить анализ набора данных, который классифицирует компании в 20 разных отраслях промышленности и около 800 категорий. Каждая категория отрасли находится в ее собственной колонке. Вот пример dataframeR - группа по нескольким столбцам

df <- data.frame(biz.name=c("goog", "face", "eb"), worth=c(100, 200, 300), 
cat1=c("social", "social", "social"), cat2=c(NA, "search", "finance"), 
cat3=c(NA, NA, "commerce")) 

Я хотел бы знать, как вести анализ по различным видам категорий. Например, как мне получить среднюю ценность разных категорий, «социальных» или «финансов». Каждая компания может иметь до 20 категорий (не повторяющихся в строке).

dplyr пакет мои нормальный идти к group_ метод, но сцепление не похож на работу для нескольких столбцов

cat.test <- df %>% 
    group_by(cat1:cat2) %>% 
    summarise (avg = mean(is.na(worth))) 

Код производит измерение для каждой перестановки бизнеса с помощью комбинации нескольких категорий , скорее, что каждая категория индивидуально. В кадре выборки категория social должна иметь общую стоимость 600 и 300.

Я просмотрел несколько руководств, но не нашел тот, который может group_by для нескольких столбцов. Спасибо и дайте мне знать, если я смогу сделать этот вопрос более ясным.

[UPDATE: редактировать data.frame код]

+0

op! извините, народ. i fixed – tom

+0

Разве сумма не должна быть 600, а средняя 200. 600/3 = 200? – thelatemail

ответ

3

Я бы использовал data.table следующим образом:

library(data.table) 
melt(setDT(df[-1]), id.vars='worth', value.name='category')[,.(worth=sum(worth)),category] 
# category worth 
#1: social 600 
#2:  NA 400 
#3: search 200 
#4: finance 300 
#5: commerce 300 
+0

отличный код! (есть дополнительный период, FYI) – tom

3

Я очистил свой код и был в состоянии получить результат с использованием data.table пакета:

df <- data.frame(biz.name=c("goog", "face", "eb"), worth=c(100, 200, 300), 
       cat1=c("social", "social", "social"), cat2=c("NA", "search", "finance"), 
       cat3=c("NA", "NA", "commerce")) 

library(data.table) 
dt <- data.table(df) 
dt[, Mean:=mean(worth), by=list(cat1, cat2)] 

> dt 
    biz.name worth cat1 cat2  cat3 Mean 
1:  goog 100 social  NA  NA 100 
2:  face 200 social search  NA 200 
3:   eb 300 social finance commerce 300 
+0

Я думаю, что OP должен расплавить 'cat1/2/3', а затем заполнить. – thelatemail

+0

@thelatemail Итак, в SQL-терминах вы говорите, что он, вероятно, должен группироваться по всем трем столбцам, а затем взять с собой совокупность, такую ​​как «средний»? –

+0

Это близко. Вышеупомянутое решение работает не так, потому что таблица данных не группируется по уникальным факторам каждой категории. Как агрегат, так и dplyr обычно делали бы это, если бы все это содержалось в одном столбце. Трюк состоит из нескольких столбцов. Если в отдельных столбцах содержатся две общие категориальные переменные, код должен был бы это распознать. – tom

3

Использование tidyr, что-то вроде:

library(tidyr) 
df %>% 
    gather(variable, category, -biz.name, -worth) %>% 
    group_by(category) %>% 
    summarise(worth=sum(worth)) 
#Source: local data frame [5 x 2] 
# 
# category worth 
#1 commerce 300 
#2 finance 300 
#3 search 200 
#4 social 600 
#5  NA 400 

Это соответствует вашей запрашиваемую сумму показатель 'социальной'

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