Here is an example of my question :
I would like to go from
A B C D E F G H
x1 x2 x3 x4 x5 x6 x7 x8
y1 y2 y3 y4 y5 y6 y7 y8
z1 z2 z3 z4 z5 z6 z7 z8
to
A B CDE FGH
x1 x2 x3 x6
x1 x2 x4 x7
x1 x2 x5 x8
y1 y2 y3 y7
y1 y2 y4 y6
y1 y2 y5 y8
I can manage to only stack 3 columns into one with this code
NewData= melt(setDT(Data),measure = list(c(6,7,8)), value.name = "FGH ")
We can use patterns
library(data.table)
melt(setDT(Data), measure = patterns("^[CDE]", "^[FGH]"),
value.name = c("CDE", "FGH"))[, variable := NULL][]
Or another option with unite
library(dplyr)
library(tidyr)
Data %>%
unite(CDE, C, D, E) %>%
unite(FGH, F, G, H) %>%
separate_rows(CDE, FGH)
Data <- structure(list(A = c("x1", "y1", "z1"), B = c("x2", "y2", "z2"
), C = c("x3", "y3", "z3"), D = c("x4", "y4", "z4"), E = c("x5",
"y5", "z5"), F = c("x6", "y6", "z6"), G = c("x7", "y7", "z7"),
H = c("x8", "y8", "z8")), class = "data.frame", row.names = c(NA,
-3L))