-1

I have a dataframe that consists of 3 columns (category name, month, and sum of units sold).

I would like to reformat my dataframe where category name and sum of units are my rows and each column represents the 12 months in the order I have specified (starting with Oct and ending with Sep).

How do I do this? My current df is structured as so:

`Category Name` Month   sum
   <fct>           <fct> <dbl>
 1 Diet Soda       Oct   34680
 2 Diet Soda       Nov   41589
 3 Diet Soda       Dec   31564
 4 Diet Soda       Jan   22635
 5 Diet Soda       Feb   34853
 6 Diet Soda       Mar   48583
 7 Diet Soda       Apr   33550
 8 Diet Soda       May   44991
 9 Diet Soda       Jun   34995
10 Diet Soda       Jul   33260
11 Diet Soda       Aug   46027
12 Diet Soda       Sep   33924
13 Diet Soda Can   Oct       0
14 Diet Soda Can   Nov       1
15 Diet Soda Can   Dec       0
16 Diet Soda Can   Jan       0
17 Diet Soda Can   Feb       0
18 Diet Soda Can   Mar       0
19 Diet Soda Can   Apr       0
20 Diet Soda Can   May       0
Dinho
  • 704
  • 4
  • 15

1 Answers1

2

One option would be pivot_wider after creating a sequence column by group

library(dplyr)
library(tidyr)
df1 %>%
   group_by(Month, `Category Name`) %>%
   mutate(rn = row_number()) %>%
   pivot_wider(names_from = Month, values_from = sum)

NOTE: the group_by/mutate is not really required in this data but for a general case

The pivot_wider reshapes data from 'long' to 'wide' format

df1 %>% 
    pivot_wider(names_from = Month, values_from = sum)
# A tibble: 2 x 13
#  `Category Name`   Oct   Nov   Dec   Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep
#  <chr>           <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1 Diet Soda       34680 41589 31564 22635 34853 48583 33550 44991 34995 33260 46027 33924
#2 Diet Soda Can       0     1     0     0     0     0     0     0    NA    NA    NA    NA

data

df1 <- structure(list(`Category Name` = c("Diet Soda", "Diet Soda", 
"Diet Soda", "Diet Soda", "Diet Soda", "Diet Soda", "Diet Soda", 
"Diet Soda", "Diet Soda", "Diet Soda", "Diet Soda", "Diet Soda", 
"Diet Soda Can", "Diet Soda Can", "Diet Soda Can", "Diet Soda Can", 
"Diet Soda Can", "Diet Soda Can", "Diet Soda Can", "Diet Soda Can"
), Month = c("Oct", "Nov", "Dec", "Jan", "Feb", "Mar", "Apr", 
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan", 
"Feb", "Mar", "Apr", "May"), sum = c(34680L, 41589L, 31564L, 
22635L, 34853L, 48583L, 33550L, 44991L, 34995L, 33260L, 46027L, 
33924L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame",
row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20"))
akrun
  • 874,273
  • 37
  • 540
  • 662
  • 2
    Brilliant - what does pivot_wider do exactly? I owe you a beer with all your help my man! – Dinho Dec 10 '19 at 18:25