R:将一个向量分解为若干重叠子向量且其第一个元素是有界的

8fsztsew  于 2023-04-27  发布在  其他
关注(0)|答案(4)|浏览(121)

我想拆分父子向量,以满足以下条件:
1.每个子向量具有相等且恒定的长度l
1.子向量以l -1彼此重叠
1.子向量的数量为length(ts) - l + 2
1.最后一个子向量应包括父向量的第一个元素作为其最后一个子元素。
.

ts <- 1:11 # the parent vector
l <- 7 # constant length of sub-vectors to be
m <- length(ts) - l + 1 # number of sub-vector to be
split(t(embed(ts, m))[m:1,], 1:m)

当我尝试这个(使用m <- length(ts) - l + 1)时,我得到了我想要的l = 7,但是m = 5而不是我想要的m = 6

#$`1`
#[1] 1 2 3 4 5 6 7

#$`2`
#[1] 2 3 4 5 6 7 8

#$`3`
#[1] 3 4 5 6 7 8 9

#$`4`
#[1]  4  5  6  7  8  9 10

#$`5`
#[1]  5  6  7  8  9 10 11

当我尝试这个(使用m <- length(ts) - l + 2)时,我得到了我想要的m = 6,但是l = 6而不是l = 7

ts <- 1:11 # the parent vector
l <- 7 # constant length of sub-vectors to be
m <- length(ts) - l + 2 # number of sub-vector to be
split(t(embed(ts, m))[m:1,], 1:m)

这就是我得到的

#$`1`
#[1] 1 2 3 4 5 6

#$`2`
#[1] 2 3 4 5 6 7

#$`3`
#[1] 3 4 5 6 7 8

#$`4`
#[1] 4 5 6 7 8 9

#$`5`
#[1]  5  6  7  8  9 10

#$`6`
#[1]  6  7  8  9 10 11

我想要的

#$`1`
#[1] 1 2 3 4 5 6 7

#$`2`
#[1] 2 3 4 5 6 7 8

#$`3`
#[1] 3 4 5 6 7 8 9

#$`4`
#[1]  4  5  6  7  8  9 10

#$`5`
#[1]  5  6  7  8  9 10 11

#$`6`
#[1]  6  7  8  9 10 11  1
mctunoxg

mctunoxg1#

给你:

ts <- 1:11 # the parent vector
l <- 7 # constant length of sub-vectors to be
m <- length(ts) - l + 2 # number of sub-vector to be

library(magrittr)
lapply(1:m, function(i){
  c(0, rep(ts, 4)) %>% # Adding leading zero (cut in first iter; repeat a few times to not run out if we increase m
    tail(-i) %>% # Cut first i elements (including added zero)
    head(l) # Retain first l of the remaining part
})
uubf1zoe

uubf1zoe2#

如果它只适用于包含从1开始的整数序列的父向量(如1:101:8),那么这应该可以:

ts <- 1:11
l <- 7
m <- length(ts) - l + 2

lapply(1:m, function(x) {
  y <- x:(x+l-1)
  y <- ifelse(y>max(ts), y-max(ts), y)} #here you make sure that 12 becomes 1 etc.
       )

但是如果你想让它适用于任何类型的原子向量(例如字母A,B,C...K),请这样做:

ts2 <- LETTERS[1:11]
l <- 7
m <- length(ts) - l + 2

# the output from the code above is stored to be used as index
idx <- lapply(1:m, function(x) {
  y <- x:(x+l-1)
  y <- ifelse(y>length(ts2), y-length(ts2), y)}
)

# apply index to the parent vector
lapply(idx, function(x) ts2[x])
flvlnr44

flvlnr443#

使用filter

ts <- 1:11 
l <- 7

lapply(seq_len(length(ts) - l + 2), function(i) {
  p <- rep(0, l)
  p[i] <- 1
  res <- c(stats::filter(rev(ts), filter = p, 
                         circular = TRUE, sides = 1))
  rev(res)[seq_len(l)]
})
#[[1]]
#[1] 1 2 3 4 5 6 7
#
#[[2]]
#[1] 2 3 4 5 6 7 8
#
#[[3]]
#[1] 3 4 5 6 7 8 9
#
#[[4]]
#[1]  4  5  6  7  8  9 10
#
#[[5]]
#[1]  5  6  7  8  9 10 11
#
#[[6]]
#[1]  6  7  8  9 10 11  1
bttbmeg0

bttbmeg04#

用适当的维度、索引和拆分填充矩阵

asplit(
  matrix(ts, nrow = length(ts) + 1, ncol = length(ts) - l + 1)[1:(l + 1), ],
  MARGIN = 2)

#[[1]]
#[1] 1 2 3 4 5 6 7
#
#[[2]]
#[1] 2 3 4 5 6 7 8
#
#[[3]]
#[1] 3 4 5 6 7 8 9
#
#[[4]]
#[1]  4  5  6  7  8  9 10
#
#[[5]]
#[1]  5  6  7  8  9 10 11
#
#[[6]]
#[1]  6  7  8  9 10 11  1

相关问题