【问题标题】:Create Dataframe w/All Combinations of 2 Categorical Columns then Sum 3rd Column by Each Combination创建具有 2 个分类列的所有组合的数据框,然后按每个组合对第 3 列求和
【发布时间】:2020-05-22 17:32:17
【问题描述】:

我有一个大而杂乱的数据集,但想要完成一件简单的事情。本质上,我想根据两列的每个组合填充一个小标题,并对第三列求和。

作为一个假设的例子,假设每个观察都有 company_name(Wendys、BK、McDonalds)、food_option(汉堡、薯条、frosty)和 total_spending(以 $ 为单位)。我想用公司、食物和总数制作一个 9x3 的小标题,作为每次观察的总和。到目前为止,这是我的代码:

df_table <- df %>% 
      group_by(company_name, food_option) %>%
      summarize(total= sum(total_spending))
 company_name                food_option               total
   <chr>                     <chr>                      <dbl>
 1 Wendys                    Burgers                   757
 2 Wendys                    Fries                     140
 3 Wendys                    Frosty                    98
 4 McDonalds                 Burgers                   1044
 5 McDonalds                 Fries                     148
 6 BK                        Burgers                   669
 7 BK                        Fries                     38

问题在于,麦当劳以“Frosty”作为 food_option 的观察结果为零。因此,我得到了一个部分表。我想用一行显示:

 8  McDonalds      Frosty   0 
 9  BK             Frosty   0

我知道我可以手动添加行,但实际的数据集有一百多个组合,所以会很繁琐和复杂。此外,我不断修改上游数据,我希望代码能够自动正确填充。

非常感谢任何可以提供帮助的人。这个论坛真是天赐之物,真的很感谢你们。

【问题讨论】:

  • 在最后尝试使用这个... %&gt;% complete(company_name, food_option, fill=list(total = 0))。这是一个tidyr 函数。
  • 是的,我走了那条路,但由于某种原因,它仍然返回完全相同的表。我想可能是因为 R 不确定要填写什么?
  • 对我来说,它适用于您发布的示例。如果它不知道要填充什么,您将只获得不存在的组合的 NA 值。所以问题一定来自其他地方。我将在下面发布答案,以便您再次查看。

标签: r dplyr tidyr tibble


【解决方案1】:

你可以使用 tidyr::expand_grid():

tidyr::expand_grid(company_name = c("Wendys", "McDonalds", "BK"), 
                   food_option = c("Burgers", "Fries", "Frosty"))

创建所有可能的变化

【讨论】:

    【解决方案2】:

    试试:

    library(dplyr)
    
    df %>% 
      mutate(food_option = factor(food_option, levels = unique(food_option))) %>% 
      group_by(company_name, food_option, .drop = FALSE) %>% 
      summarise(total = sum(total_spending))
    

    较新版本的dplyr 具有group_by.drop 参数,如果你有一个具有预定义水平的因子,它们将不会被删除(你会得到零)。

    【讨论】:

      【解决方案3】:
      library(tidyverse)
      
      # example data
      df = read.table(text = "
      company_name                food_option               total
      1 Wendys                    Burgers                   757
      2 Wendys                    Fries                     140
      3 Wendys                    Frosty                    98
      4 McDonalds                 Burgers                   1044
      5 McDonalds                 Fries                     148
      6 BK                        Burgers                   669
      7 BK                        Fries                     38
      ", header=T)
      
      df %>% complete(company_name, food_option, fill=list(total = 0))
      
      # # A tibble: 9 x 3
      #   company_name food_option total
      #   <fct>        <fct>       <dbl>
      # 1 BK           Burgers       669
      # 2 BK           Fries          38
      # 3 BK           Frosty          0
      # 4 McDonalds    Burgers      1044
      # 5 McDonalds    Fries         148
      # 6 McDonalds    Frosty          0
      # 7 Wendys       Burgers       757
      # 8 Wendys       Fries         140
      # 9 Wendys       Frosty         98
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-24
        相关资源
        最近更新 更多