我试图对数据集进行分析,该数据集将公司分为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代码]
答案 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