bounty还有5天到期。回答此问题可获得+50声望奖励。Daniel James想要引起更多关注这个问题:我需要的解决方案,可以采取时间序列作为输入或向量,而不是由这个唯一的答案提供的时间序列作为键入这个的时间。
我想将一个名为ts
的父向量分割成几个满足以下条件的子向量:
为清楚起见编辑
1.每个子向量具有相等的长度l
,其小于父向量v
的数量。
1.每个子向量在其元素的组成方面是唯一的,并且包含连续的元素。
1.特定子向量的元素与先前和后续子向量的元素重叠。
1.每个元素在整个拆分过程中出现l - 1
时间。
1.一些块元素可以以这样的方式反弹,即父向量的开始到结束的元素形成子向量。
1.输入应该是父向量v
的向量,以及块长度l
的整数。而输出应该是向量的列表(不是矩阵),使得每个子向量作为向量输出,并且所有子向量的列表是列表。
为了说明,考虑父向量1
到10
,子向量大小为3
,其父向量的连续元素如下:
1, 2, 3
2, 3, 4
4, 5, 6
5, 6, 7
7, 8, 9
8, 9, 10
10, 1, 2
我所做的是用这个R代码形成一个length(ts)
子向量(也就是说,子向量的数量等于父向量的数量):
v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
l <- 3
purrr::map(
v,
seq, length.out = l
) |>
purrr::map(\(x) ifelse(x > max(v), x - max(v), x))
产生了这个
1, 2, 3
2, 3, 4
3, 4, 5
4, 5, 6
5, 6, 7
6, 7, 8
7, 8, 9
8, 9, 10
9, 10, 1
10, 1, 2
然后手动删除一些破坏my rule3
的子向量
3, 4, 5
6, 7, 8
9, 10, 1
我需要什么
我需要一个R
代码,它可以提供我想要的输出
1, 2, 3
2, 3, 4
4, 5, 6
5, 6, 7
7, 8, 9
8, 9, 10
10, 1, 2
无需人工干预。
2条答案
按热度按时间wztqucjr1#
我们假设反弹意味着
min(myVec)
可以紧跟着max(myVec)
,并且它仍然被视为“连续”。我们假设连续意味着除了反弹之外,值增加1。使用
embed
创建以子向量为行的tab
矩阵,并创建一个consec
矩阵,该矩阵的列是长度为subLen
的有效“连续”子向量(考虑到反弹)。然后遍历
tab
的行,如果该行不是consec
中的列,或者其中的任何元素都将导致subLen
出现多次,则将ok设置为FALSE。最后由它得到子集tab
。在问题中,0不是
myVec
的元素,我们假设这通常是真的,因此我们可以将不满足条件的行清零。如果这不是真的,一般来说,我们可以NA出这些行,但使用0会导致更短的代码。给予
1tu0hz3e2#
我猜你可以试试下面的代码
我们可以做一些测试
它给出了