在 OP 的帖子中显示的 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 是一个函数名。最好不要用函数名或其他保留字来命名对象
数据
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))