1

I have a data frame that I am trying to group by a column and pivot_wider. Here is my data frame

df = structure(list(Date = structure(c(1608238800, 1608238800, 1608238800, 
1608238802, 1608238800, 1608238800, 1608238802, 1608238800, 1608238800, 
1608238802, 1608238802, 1608238800, 1608238800, 1608238800, 1608238802, 
1608238800, 1608238800, 1608238800), tzone = "America/New_York", class = c("POSIXct", 
"POSIXt")), Last = c(56.15, 7.9, 196.29, 311, 458.07, 18.38, 
377.08, 70.61, 4.02, 372.19, 15.7, 391.2, 9.1, 66.62, 176.25, 
6.9, 28.74, 128.7), ticker = c("FAS", "FAZ", "IWM", "QQQ", "SOXL", 
"SOXS", "SOXX", "SPXL", "SPXS", "SPY", "SQQQ", "TECL", "TECS", 
"TNA", "TQQQ", "TZA", "XLF", "XLK"), Core = c("XLF", "XLF", "IWM", 
"QQQ", "SOXX", "SOXX", "SOXX", "SPY", "SPY", "SPY", "QQQ", "XLK", 
"XLK", "IWM", "QQQ", "IWM", "XLF", "XLK"), Type = c("ETNBull", 
"ETNBear", "ETF1x", "ETF1x", "ETNBull", "ETNBear", "ETF1x", "ETNBull", 
"ETNBear", "ETF1x", "ETNBear", "ETNBull", "ETNBear", "ETNBull", 
"ETNBull", "ETNBear", "ETF1x", "ETF1x")), row.names = c(NA, -18L
), groups = structure(list(ticker = c("FAS", "FAZ", "IWM", "QQQ", 
"SOXL", "SOXS", "SOXX", "SPXL", "SPXS", "SPY", "SQQQ", "TECL", 
"TECS", "TNA", "TQQQ", "TZA", "XLF", "XLK"), .rows = structure(list(
    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
    15L, 16L, 17L, 18L), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, 18L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))


head(df)

Date           Last ticker Core  Type      
1 2020-12-17   56.2  FAS    XLF   ETNBull
2 2020-12-17   7.9   FAZ    XLF   ETNBear
3 2020-12-17   196.  IWM    IWM   ETF1x  
4 2020-12-17   311   QQQ    QQQ   ETF1x  
5 2020-12-17   458.  SOXL   SOXX  ETNBull
6 2020-12-17   18.4  SOXS   SOXX  ETNBear

I would like to group by "Core" and pivot wider using Type as the new columns and ticker as the values. For example, i would like my new data frame to look like this

Date           Last  Core   ETNBull  ETNBear ETF1x   
1 2020-12-17   56.2   XLF    FAS      FAZ     XLF
2 2020-12-17   7.9    IWM    TNA      TZA     IWM   
.
.

You can see we grouped by "Core" and then spread by "Type" using 'ticker' as the values.

Here is an example of one attempt that did not have the desired results

df %>% group_by(Core) %>% pivot_wider(names_from = Type, values_from = ticker)
Jordan Wrong
  • 1,205
  • 1
  • 12
  • 32

1 Answers1

4

Maybe you are looking for :

library(dplyr)
library(tidyr)

df %>% 
  pivot_wider(names_from = Type, values_from = ticker) %>%
  group_by(Core) %>%
  fill(ETNBull:ETF1x, .direction = 'updown')
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213