2015-09-07 284 views
3

我正在尝试对将公司分类为20个不同行业和800个类别的数据集进行分析。每个行业类别都有自己的专栏。下面是一个示例数据帧R - 按多列分组

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_BY方法,但链接似乎并不多列

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

的代码产生一个度量的企业每个排列与多个类别的组合工作,而不是单独分类。在示例数据框架中,社交类别的总净值应为600,平均值为300.

我已经查看了多个教程,但还没有找到一个可以为group_by多列的教程。谢谢,让我知道如果我可以更清楚地提出这个问题。

[更新:编辑data.frame代码]

+0

op!抱歉的人。我固定 – 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

伟大的代码! (有一个额外的时期,供参考) – 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术语来说,你应该说他应该将所有三列进行分组,然后从中取出一个集合,例如“mean”。 –

+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 

这匹配你所要求的'社交'总和数字