R: Разделить вектор на перекрывающиеся субвекторы равной длины - PullRequest
2 голосов
/ 09 октября 2019

Предположим, у меня есть вектор от 1 до 10, и я хочу разделить его на подвекторы следующих двух условий:

  1. равной длины 3.

  2. с перекрытием 1.

Я получил почти готовый ответ Разделенный вектор с перекрывающимися выборками в R с функцией, которую я изменил ниже:

splitWithOverlap <- function(vec, seg.length, overlap) {
  starts = seq(1, length(vec), by=seg.length-overlap)
  ends   = starts + seg.length - 1
  ends[ends > length(vec)] = length(vec)

  lapply(1:length(starts), function(i) vec[starts[i]:ends[i]])
}
> splitWithOverlap(1:10, 3, 2)

, который произвел

#[[1]]
#[1] 1 2 3

#[[2]]
#[1] 2 3 4

#[[3]]
#[1] 3 4 5

#[[4]]
#[1] 4 5 6

#[[5]]
#[1] 5 6 7

#[[6]]
#[1] 6 7 8

#[[7]]
#[1] 7 8 9

#[[8]]
#[1]  8  9 10

#[[9]]
#[1]  9 10

#[[10]]
#[1] 10    

, что я хочу, это

#[[1]]
#[1] 1 2 3

#[[2]]
#[1] 2 3 4

#[[3]]
#[1] 3 4 5

#[[4]]
#[1] 4 5 6

#[[5]]
#[1] 5 6 7

#[[6]]
#[1] 6 7 8

#[[7]]
#[1] 7 8 9

#[[8]]
#[1]  8  9 10

, потому что оба условия математически выполнены, number of blocks = vector length - subvector length + 1(10 - 3 + 1) = 8, а не 10

Я хочу изменить функцию, чтобы она остановилась на подвекторе 8.

Ответы [ 2 ]

4 голосов
/ 09 октября 2019

ДАННЫЕ

len = 3
ov = 1
vec = 1:10

1

lapply(1:(length(vec) - (len - ov)), function(i){
    vec[i:(i + len - ov)]
})

2

ind = rep(1:len, length(vec) - (len - ov))
matrix(vec[ind + ave(ind, ind, FUN = seq_along) - 1], ncol = len, byrow = TRUE)
4 голосов
/ 09 октября 2019

Вот один вариант с embed, чтобы сгенерировать matrix, а затем разделить на строку с asplit

n <- 3
n1 <- length(v1)
asplit(embed(c(v1, v1), n)[seq_len(n1- n+1), n:1], 1)
#[[1]]
#[1] 1 2 3

#[[2]]
#[1] 2 3 4

#[[3]]
#[1] 3 4 5

#[[4]]
#[1] 4 5 6

#[[5]]
#[1] 5 6 7

#[[6]]
#[1] 6 7 8

#[[7]]
#[1] 7 8 9

#[[8]]
#[1]  8  9 10

data

v1 <- 1:10
...