R - 按多列分组

时间:2015-09-07 06:20:07

标签: r

我试图对数据集进行分析,该数据集将公司分为20个不同的行业和大约800个类别。每个行业类别都在其自己的专栏中。这是一个示例数据框

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"))

我想知道如何对不同类别的类别进行分析。例如,我如何获得不同类别的平均价值,&#34; social&#34;或者&#34; finance&#34;。每家公司最多可以有20个类别(每行不重复)。

dplyr包是我常用的group_by方法,但链接似乎不适用于多列

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

该代码针对多个类别的组合生成每个商家排列的度量,而不是每个类别。在样本数据框中,社会类别的总净值应为600,平均值为300.

我已经查看了多个教程,但是找不到可以将group_by用于多个列的教程。谢谢,让我知道我是否可以更清楚地提出这个问题。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

这符合您要求的“社交”总和数字

答案 2 :(得分: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