Применение функции разделения к перекрывающимся строкам матрицы - PullRequest
0 голосов
/ 11 июня 2018

Предположим, у меня есть матрица, которая выглядит следующим образом:

[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 голосов
/ 11 июня 2018

Метод 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))
...