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.
The below image is the expected result that I want from the dataset.
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)))
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