我想把一个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
和其他所有条件。
为了说明,考虑父向量x1
到x10
,子向量大小为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)
。
3条答案
按热度按时间wfveoks01#
也许这能帮上忙
bvuwiixz2#
一种可能性是创建一个空列表,并仅当其第一个元素不能被
l
整除时才追加每个子向量。然后从创建的列表中删除所有NULL
元素。或者作为函数:
这不是一个非常“
R
”的典型解决方案,也许有一些更优雅的东西,但它也不是一个非常R典型的问题。r3i60tvu3#
关于: