Search code examples
rtidyverserowsreshape2tibble

Wide the tibble into row and creating new columns based on row using R


The below image is a representation of the data set. I tried using reshape and pivot_wider to widen the data but could not get the result in a manner which I expected. I tried Merging multiple rows into single row from the stack overflow but found that the solution was wrong.

Dataset

The below image is the expected result that I want from the dataset. Expected Results

Code for the random dataset generation :

df1 <- data.frame(Components = c(rep("ABC",5),rep("BCD",5)), 
              Size = c(sample(1:100,5),sample(45:100,5)),
              Age = c(sample(1:100,5),sample(45:100,5)))

Solution

  • Try this tidyverse solution which will produce an output close to what you want. You can group by Components then create a sequential id that will identify the future columns. After that reshape to long (pivot_longer()) combine the variable name with the id and then reshape to wide (pivot_wider()). Here the code where I have used the data you shared:

    library(tidyverse)
    #Code
    newdf <- df1 %>% group_by(Components) %>% mutate(id=row_number()) %>%
      pivot_longer(-c(Components,id)) %>%
      mutate(name=paste0(name,'.',id)) %>% select(-id) %>%
      pivot_wider(names_from = name,values_from=value)
    

    Output:

    # A tibble: 2 x 11
    # Groups:   Components [2]
      Components Size.1 Age.1 Size.2 Age.2 Size.3 Age.3 Size.4 Age.4 Size.5 Age.5
      <fct>       <int> <int>  <int> <int>  <int> <int>  <int> <int>  <int> <int>
    1 ABC            23    94     52    89     15    25     76    38     33    99
    2 BCD            59    62     55    81     81    61     80    83     97    68