假设我有一个如下所示的矩阵:
[1] a b c
[2] d e f
[3] g h i
[4] j k l
[5] m n o
[6] p q r
现在我想把这个矩阵分成每个3行的小矩阵,从第一行开始,然后是第二行......,所以它最终看起来像这样:
[1] a b c
[2] d e f
[3] g h i
[1] d e f
[2] g h i
[3] j k l
[1] g h i
[2] j k l
[3] m n o
...
我尝试了以下代码,但我没有这样做:
lapply(split(1:nrow(matrix),(1:nrow(matrix)-1) %/%3+1),
function(i) matrix[i,])
有人可以帮我这个吗?
答案 0 :(得分:1)
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))