我想用以下内容将一个向量拆分为多个子向量: G条件:

  1. 每个子向量具有相等的长度l,其小于 亲本向量v的.

  2. 每个子向量在其元素组成中都是唯一的,并包含 连续的元素.

  3. 特定子向量的元素与 前一子向量和后续子向量.

  4. 任何子矢量都不能以可被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开始等等.

  5. 输入应该是父向量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),但当我try 以下代码时:

What I Want

$`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整除的位置.同样的考虑也适用于第六个和假设的第七个子向量.

How I Need It

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

推荐答案

一种可能性是创建一个空列表,并仅在其第一个元素不能被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相关问答推荐

R:随机抽取所有可能排列的样本

在水平条形图中zoom x_轴

按块将载体转换为矩阵-reshape

随机森林回归:下拉列重要性

次级y轴R gggplot2

R Highcharts与两个位置关联的注释

如何在xyplot中 for each 面板打印R^2

S用事件解决物质平衡问题

标识R中多个列中缺少的唯一值

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

多个模拟序列间的一种预测回归关系

提取一个列表中单个列的重复观察结果R

根据现有列的名称和字符串的存在进行变异以创建多个新列

警告消息";没有非缺失的参数到min;,正在返回数据中的inf";.表分组集

如何在PrePlot()中将多个元素设置为斜体

以不同于绘图中元素的方式对GG图图例进行排序

计算使一组输入值最小化的a、b和c的值

在GT()中的列之间添加空格

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

有没有办法更改ggplot2中第二个y轴的比例限制?