Создайте кадр данных со всеми комбинациями из 2 категориальных столбцов, затем суммируйте 3-й столбец по каждой комбинации - PullRequest
0 голосов
/ 06 февраля 2020

У меня большой грязный набор данных, но я хочу сделать sh прямолинейную вещь. По сути, я хочу заполнить таблицу на основе каждой комбинации двух столбцов и сложить третий столбец.

В качестве гипотетического примера, скажем, каждое наблюдение имеет название компании (Wendys, BK, McDonalds), food_option (бургеры, картофель фри, морозный) и total_spending (в $). Я хотел бы сделать выпивку 9х3 с компанией, едой и итогом в виде суммы каждого наблюдения. Вот мой код:

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

Проблема в том, что McDonalds имеет нулевые наблюдения с "Frosty" в качестве food_option. Следовательно, я получаю неполную таблицу. Я хотел бы заполнить это строкой, которая показывает:

 8  McDonalds      Frosty   0 
 9  BK             Frosty   0

Я знаю, что могу добавить строки вручную, но фактический набор данных имеет более ста комбинаций, поэтому он будет утомительным и сложным. Кроме того, я постоянно изменяю вышестоящие данные и хочу, чтобы код автоматически заполнялся правильно.

Большое спасибо всем, кто может помочь. Этот форум действительно был находкой, очень ценю всех вас.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

Попробуйте:

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 имеют аргумент .drop для group_by, где, если у вас есть коэффициент с предопределенными уровнями, они не будут удалены (и вы получите нули).

0 голосов
/ 06 февраля 2020
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
0 голосов
/ 06 февраля 2020

Вы можете использовать tidyr :: expand_grid ():

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

, чтобы создать все возможные варианты

...