Если показанные данные совпадают с показанными, это можно сделать путем простого разделения столбцов и rbind
наборов данных после установки одинаковых имен столбцов
library(dplyr)
rbind(df1[1:4], setNames(df1[c(1, 5:7)], names(df1)[1:4])) %>%
arrange(1)
Если столбцов много, автоматическим c методом, который легче понять, будет seq
. L oop по последовательности индекса, подмножество столбцов, rbind
внутри do.call
, так как мы создаем list
путем цикла
out <- cbind(df1[1], do.call(rbind, lapply(seq(2, ncol(df1), by = 3),
function(i) setNames(df1[i:(i+2)], paste0("v", 2:4)))))
out[order(out$v1),]
data
df1 <- structure(list(v1 = c("a", "b", "c"), v2 = c(1L, 7L, 4L), v3 = c(2L,
8L, 5L), v4 = c(3L, 9L, 6L), v5 = c(4L, 1L, 7L), v6 = c(5L, 2L,
8L), v7 = c(6L, 3L, 9L)), class = "data.frame", row.names = c(NA,
-3L))