将分割函数应用于矩阵的重叠行

时间:2018-06-10 21:09:37

标签: r matrix split apply

假设我有一个如下所示的矩阵:

[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,])

有人可以帮我这个吗?

1 个答案:

答案 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))