Мы можем сделать
n <- 3
do.call(rbind, lapply(split.default(df1, f = gl(
n = n, k = n, length = ncol(df1)
)), setNames, nm = names(df1)[1:n]))
# a b c
#1 1 2 3
#2 4 5 6
#3 7 8 9
Объяснение
Первый шаг - разделить ваши данные на каждые три столбца.Мы используем split.default()
в сочетании с gl()
для этой задачи.gl()
определяет группировку.
gl(n = n, k = n, length = ncol(df1))
#[1] 1 1 1 2 2 2 3 3 3
#Levels: 1 2 3
Результатом split.default
является список
split.default(df1, f = gl(n = n, k = n, length = ncol(df1)))
#$`1`
# a b c
#1 1 2 3
#
#$`2`
# d e f
#1 4 5 6
#
#$`3`
# g h i
#1 7 8 9
Чтобы использовать rbind
, столбцы должны иметь одинаковые имена.Поэтому я использую lapply()
и setNames
, чтобы переименовать все столбцы в names(df1)[1:n]
, то есть
lapply(split.default(df1, f = gl(n = n,
k = n,
length = ncol(df1))),
setNames, nm = names(df1)[1:n])
Наконец, мы вызываем do.call(rbind, ...)
, чтобы объединить три набора данных в один.
данные
df1 <- structure(list(a = 1L, b = 2L, c = 3L, d = 4L, e = 5L, f = 6L,
g = 7L, h = 8L, i = 9L), .Names = c("a", "b", "c", "d", "e",
"f", "g", "h", "i"), class = "data.frame", row.names = c(NA,
-1L))