5

周期序列是在n项之后重复自身的序列,例如,以下是周期序列:

1, 2, 3, 1, 2, 3, 1, 2, 3, ...

我们将该序列的周期定义为每个子序列中的项数(上面的子序列为 1、2、3)。所以上述序列的周期是 3。

在 R 中,我可以定义上述序列(尽管不是无穷大),使用:

sequence <- rep(c(1,2,3),n) #n is a predefined variable

因此,如果n = 50,sequence将是序列 1, 2, 3, 1, 2, 3, ... , 1, 2, 3,其中每个数字出现了 50 次,显而易见。

我正在寻找建立一个计算周期的函数sequence。伪代码如下:

period <- function(sequence){
    subsequence <- subsequence(sequence) #identify the subsequence
    len.subsequence <- length(subsequence) #calculate its length
    return(len.subsequence) #return it
}

我将如何识别子序列?这是函数的一种反转rep,这样我传入一个序列,它传递出初始向量的长度。

4

3 回答 3

4

如果周期始终相同,即序列永远不会改变,那么您可以使用循环lag来查看何时发生匹配。

在完全偏差的情况下,我还建议使用 seqle(猜猜是谁编写了该函数:-)),这类似于rle但可以找到序列。 检测结果整数序列的间隔 我不是唯一一个以这种方式编辑“rle”源的人。

于 2012-10-10T17:35:14.507 回答
1

使用该序列相当容易,尽管我会避免使用名称“序列”,因为它是一个 R 函数名称。这将识别任何单调序列的周期性,因此它更通用,但它不会识别如下序列:1.2.3.4.2.3.4,1,2,3,4,2,3,4, ....

> which(diff(seQ) < 0)
[1]  3  6  9 12 15 18 21 24 27
> diff(which(diff(seQ) < 0) )
[1] 3 3 3 3 3 3 3 3

您可以测试间隔的相等性或使用其中任何一个结果来索引原始向量。你应该用 c(1, 2, 3, 4, 2, 3, 4, 1, 2, 3, 4, 2, 3, 4) 测试你的答案,看看他们是否通过了识别非单调重复的测试. 到目前为止,他们都没有这样做;因为没有报告周期为 7。

于 2012-10-10T17:51:32.590 回答
1

在@DWin 的基础上,您可能可以创建一个类似这样的函数:

subsequence <- function(data) {
  ii <- 0
  while (TRUE) {
    ii <- ii + 1
    LAG <- sum((diff(data, lag = ii) == 0) - 1)
    if (LAG == 0) { break }
  }
  list(Period = ii, 
       Sequence = data[1:ii], 
       Reps = length(data)/ii) 
}

注意这是我第一次使用while(),所以我不确定是否有更好的方法来实现它。

这是一些数据;s3 是非单调的:

s1 <- rep(c(1,2,3), 3)
s2 <- rep(c(1,2,3), 50)
s3 <- c(1, 2, 3, 4, 2, 3, 4, 1, 2, 3, 4, 2, 3, 4)

这是subsequence()函数的结果。

subsequence(s1)
# $Period
# [1] 3
# 
# $Sequence
# [1] 1 2 3
# 
# $Reps
# [1] 3

subsequence(s2)
# $Period
# [1] 3
# 
# $Sequence
# [1] 1 2 3
# 
# $Reps
# [1] 50

subsequence(s3)
# $Period
# [1] 7
# 
# $Sequence
# [1] 1 2 3 4 2 3 4
# 
# $Reps
# [1] 2
于 2012-10-10T19:09:15.323 回答