R语言 在下列条件下将一个向量分解为若干个重叠的子向量

oymdgrw7  于 2023-06-03  发布在  其他
关注(0)|答案(3)|浏览(177)

我想把一个vector分解成子vector,如下所示:g条件:
1.每个子向量具有相等的长度l,其小于父向量v的数量。
1.每个子向量在其元素的组成方面是唯一的,并且包含连续的元素。
1.特定子向量的元素与先前和后续子向量的元素重叠。
1.任何子向量都不能从可被l整除的元素的位置开始。例如,如果l=2没有子向量必须开始2, 4, 6, 8, 10, 12, ..., n,对于l=3没有子向量必须开始3, 6, 9, 12, 15, 18, ..., n,对于l=3没有子向量必须开始4, 8, 12, 16, 20, 24, ..., n等。
1.输入应该是父向量v的向量,以及块长度l的整数。而输出应该是向量的列表(不是矩阵),使得每个子向量作为向量输出,并且所有子向量的列表是列表。
下面的代码显示了不应用上面的conditiontion 4的情况。

v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) # the parent vector
l <- 3 # constant length of sub-vectors to be
m <- length(v) - l + 1 # number of sub-vector to be
split(t(embed(v, m))[m:1,], 1:m)

$`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

我在上面的代码中得到的结果现在将通过手动删除违反上面condition number 4的子向量来打开。
我知道我的子向量数应该是length(ts) - l + 1 - floor((length(ts) - l + 1)/l),但当我尝试下面的代码时:

我想要的

$`1`
[1] 1 2 3

$`2`
[1] 2 3 4

$`3`
[1] 4 5 6

$`4`
[1] 5 6 7

$`5`
[1] 7 8 9

$`6`
[1]  8  9 10

结果必须满足我的number 4 condition和其他所有条件。
为了说明,考虑父向量x1x10,子向量大小为l = 3,其父向量的连续元素如下:

x1, x2, x3
    x2, x3, x4
            x4, x5, x6
                x5, x6, x7
                        x7, x8, x9
                            x8, x9, x10

我所做的是形成一系列子向量,每个子向量的长度为l =3,起始元素本质上是渐进的(x1, x2 x4, x5, x7, x8, x10),而不是递归的。第三个子向量从x4开始,而不是从x3开始,因为从x3开始将使x3 3成为可被l = 3整除的原始向量的位置。相同的考虑应用于第6和假定的第7子向量。

我多么需要

我需要一个R代码,根据上面的条件给出我想要的输出。您可以使用v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)作为父向量输入,并在R code测试中选择1 < l < length(v)

wfveoks0

wfveoks01#

也许这能帮上忙

m1 <- embed(c(v, v), 3)[seq_len(m), l:1]
 asplit(m1[!!m1[,1] %% l,], 1)
  • 输出
[1]]
[1] 1 2 3

[[2]]
[1] 2 3 4

[[3]]
[1] 4 5 6

[[4]]
[1] 5 6 7

[[5]]
[1] 7 8 9

[[6]]
[1]  8  9 10
bvuwiixz

bvuwiixz2#

一种可能性是创建一个空列表,并仅当其第一个元素不能被l整除时才追加每个子向量。然后从创建的列表中删除所有NULL元素。

v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) # the parent vector
l <- 3 # constant length of sub-vectors to be
m <- length(v) - l + 1 # number of sub-vector to be

li <- vector("list",m)

for (i in 1:m) {
  if (v[i]%%l) {
    li[[i]] <- v[i:(i+l-1)]
  }
}

> Filter(Negate(is.null),li)
[[1]]
[1] 1 2 3

[[2]]
[1] 2 3 4

[[3]]
[1] 4 5 6

[[4]]
[1] 5 6 7

[[5]]
[1] 7 8 9

[[6]]
[1]  8  9 10

或者作为函数:

kmers <- function(v,k) {
  m <- (length(v)-k+1)
  li <- vector("list",m)
  for (i in 1:m) {
    if (v[i]%%k) {
      li[[i]] <- v[i:(i+k-1)]
    }
  }
  Filter(Negate(is.null),li)
}

> kmers(v,3)
[[1]]
[1] 1 2 3

[[2]]
[1] 2 3 4

[[3]]
[1] 4 5 6

[[4]]
[1] 5 6 7

[[5]]
[1] 7 8 9

[[6]]
[1]  8  9 10

这不是一个非常“R”的典型解决方案,也许有一些更优雅的东西,但它也不是一个非常R典型的问题。

r3i60tvu

r3i60tvu3#

关于:

parent <- paste0('x', 1:10)
len <- 3

subvectors <- 
  outer(seq_along(parent), 
        seq_len(len),
        \(x, y) parent[-1 + x + y]
        ) |>
  (`[`)(which(seq_along(parent) %% len != 0),) |>
      apply(1, c, simplify = F)
## > subvectors
[[1]]
[1] "x1" "x2" "x3"

[[2]]
[1] "x2" "x3" "x4"

[[3]]
[1] "x4" "x5" "x6"
##

相关问题