Метод split
, показанный в посте ОП, будет разбит на блоки по 3 строки, и он не будет взаимоисключающим.Принимая во внимание, что если мы хотим разделить таким образом, чтобы каждый элемент list
начинался с каждой из строк matrix
и следующих двух строк, мы можем циклически пройти последовательность строк, получить последовательность от этого индекса до следующегодва и подмножество matrix
lapply(head(seq_len(nrow(matrix)), -2), function(i) matrix[i:(i+2),])
#[[1]]
# [,1] [,2] [,3]
#[1,] "a" "b" "c"
#[2,] "d" "e" "f"
#[3,] "g" "h" "i"
#[[2]]
# [,1] [,2] [,3]
#[1,] "d" "e" "f"
#[2,] "g" "h" "i"
#[3,] "h" "k" "l"
#[[3]]
# [,1] [,2] [,3]
#[1,] "g" "h" "i"
#[2,] "h" "k" "l"
#[3,] "m" "n" "o"
[[4]]
[,1] [,2] [,3]
[1,] "h" "k" "l"
[2,] "m" "n" "o"
[3,] "p" "q" "r"
. Или, как предлагает @lmo, другой версией выше будет
lapply(seq_len(nrow(matrix) -2L) - 1L, function(x) matrix[x + 1:3,])
, или другой вариант - создать группу разделения.с помощью rollapply
(из zoo
), а затем выполните split
library(zoo)
grp <- rollapply(seq_len(nrow(matrix)), 3, FUN = I)
lapply(split(grp, row(grp)), function(i) matrix[i, ])
ПРИМЕЧАНИЕ: matrix
- это имя функции.Лучше не называть объекты именами функций или другими зарезервированными словами
data
matrix <- structure(c("a", "d", "g", "h", "m", "p", "b", "e", "h", "k",
"n", "q", "c", "f", "i", "l", "o", "r"), .Dim = c(6L, 3L))