首页 文章

R - 按多列分组

提问于
浏览
3

我正在尝试对数据集进行分析,该数据集将公司分为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"))

我想知道如何对不同类别的类别进行分析 . 例如,我如何获得不同类别的平均 Value ,“社交”或“融资” . 每个公司最多可以有20个类别(每行不重复) .

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

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

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

我查看了多个教程,但没有找到一个可以group_by用于多列的教程 . 谢谢,让我知道我是否可以更清楚地提出这个问题 .

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

3 回答

  • 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
    
  • 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
    
  • 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
    

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

相关问题