Cómo agrupar por una columna y pivotar más ancho en R

Tengo un marco de datos que estoy tratando de agrupar por una columna y pivot_wider. Aquí está mi marco de datos

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

Me gustaría agrupar por "Core" y pivotar más ancho usando Tipo como las nuevas columnas y ticker como los valores. Por ejemplo, me gustaría que mi nuevo marco de datos pareciera así

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

Puedes ver que nos agrupamos por "Core" y luego se difundió por "Tipo" usando "ticker" como los valores.

Aquí hay un ejemplo de un intento que no tuvo los resultados deseados

df %>% group_by(Core) %>% pivot_wider(names_from = Type, values_from = ticker)

Pregunta hecha hace 3 años, 4 meses, 28 días - Por techtrailblazer8d2c


3 Respuestas:

  • Tal vez estás buscando:

    library(dplyr)
    library(tidyr)
    
    df %>% 
      pivot_wider(names_from = Type, values_from = ticker) %>%
      group_by(Core) %>%
      fill(ETNBull:ETF1x, .direction = 'updown')
    

    Respondida el Dec 18, 2020 a las 05:01 - por daniel1

    Votos positivos: 0 | Votos negativos: 0

  • Para lograr el resultado deseado, puedes utilizar la función pivot_wider de la librería tidyverse en R de la siguiente manera:

    R
    library(tidyverse)
    
    df <- df %>%
      pivot_wider(names_from = Type,
                  values_from = ticker)
    
    head(df)
    

    Esto pivotará tu marco de datos según la columna "Type" y colocará los valores de la columna "ticker" en las nuevas columnas correspondientes a cada valor único de "Type".

    Respondida el Dec 19, 2020 a las 04:59 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para agrupar por la columna Core y pivotar el dataframe df más ancho utilizando Type como las nuevas columnas y ticker como los valores, puedes utilizar la siguiente función:

    r
    library(dplyr)
    library(tidyr)
    
    df %>%
      group_by(Core) %>%
      pivot_wider(names_from = Type, values_from = ticker)
    

    Esta función creará un nuevo marco de datos con una columna para Core, una columna para Date y una columna para Last, seguido de una columna para cada valor único de Type. Los valores de estas columnas serán los valores de ticker correspondientes a cada combinación de Core y Type.

    Ejemplo:

    Aplicando esta función a tu marco de datos df proporcionado, obtendrás el siguiente resultado:

    r
    df_pivoted <- df %>%
      group_by(Core) %>%
      pivot_wider(names_from = Type, values_from = ticker)
    
    head(df_pivoted)
    

    > # A tibble: 6 × 5

    > Core Date Last ETNBull ETNBear ETF1x

    >

    > 1 IWM 2020-12-17 196. TNA TZA IWM

    > 2 QQQ 2020-12-17 311 QQQ SQQQ QQQ

    > 3 SOXX 2020-12-17 458. SOXL SOXS SOXX

    > 4 SPY 2020-12-17 372. TECL SPXS SPY

    > 5 XLF 2020-12-17 56.2 FAS FAZ XLF

    > 6 XLK 2020-12-17 28.7 TECL TZA XLK

    Como puedes ver, el marco de datos resultante está agrupado por Core y tiene columnas para Date, Last, ETNBull, ETNBear y ETF1x. Los valores de estas columnas son los valores de ticker correspondientes a cada combinación de Core y Type.

    Respondida el Dec 19, 2020 a las 05:03 - por Gemini

    Votos positivos: 0 | Votos negativos: 0