测量一系列数字的周期性[R]

时间:2012-10-10 17:24:50

标签: r sequence

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

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

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

在R中,我可以使用:

定义上述序列(尽管不是无穷大)
sequence <- rep(c(1,2,3),n) #n is a predefined variable

因此,如果n = 50sequence将是序列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函数的反转,这样我传入一个序列并传递出初始向量的长度。

3 个答案:

答案 0 :(得分:4)

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

总偏见,我还建议使用seqle(猜猜谁写了这个函数:-)),这就像rle但是找到了序列。 detect intervals of the consequent integer sequences 我不是唯一一个以这种方式编辑“rle”来源的人。

答案 1 :(得分:1)

使用该序列相当容易,但我会避免使用名称'sequence',因为它是一个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期。

答案 2 :(得分: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