Search code examples
rstatisticstranspose

R Transposing row values to colum


The output of data %>% select(Year, Type) %>% table() give me:

Year  Type Freq
2001    A     5
2002    A     2
2003    A     9
...    ...  ...
2001    B    21   
2002    B    22
2003    B    19

How I would like my data:

Year  A   B   C   D   E  
2001  5  21   ..  ..  ..
2002  2  22   ..  ..  .. 
2003  9  19   ..  ..  ..
...

How can I achieve this? The examples I find don't seem to match my case


Solution

  • A base R option using reshape

    reshape(
      df,
      direction = "wide",
      idvar = "Year",
      timevar = "Type"
    )
    

    gives

      Year Freq.A Freq.B
    1 2001      5     21
    2 2002      2     22
    3 2003      9     19
    

    A data.table option

    dcast(setDT(df), Year ~ Type)
    

    gives

       Year A  B
    1: 2001 5 21
    2: 2002 2 22
    3: 2003 9 19
    

    A dplyr option

    df %>%
      pivot_wider(names_from = Type, values_from = Freq)
    

    gives

    # A tibble: 3 x 3
       Year     A     B
      <int> <int> <int>
    1  2001     5    21
    2  2002     2    22
    3  2003     9    19
    

    Data

    > dput(df)
    structure(list(Year = c(2001L, 2002L, 2003L, 2001L, 2002L, 2003L
    ), Type = c("A", "A", "A", "B", "B", "B"), Freq = c(5L, 2L, 9L,
    21L, 22L, 19L)), class = "data.frame", row.names = c(NA, -6L))