2012-10-10 31 views
3

周期性序列是重复自身后Ñ术语,例如序列,下面是一个周期序列:测量数[R]的序列的周期

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

我们定义序列的期间是在每个子序列的项数(上述子序列是1,2,3)。因此,对于上面的序列周期设为3

在R,I可以定义上述序列(虽然不是到无穷大),使用:

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功能的,使得我通过在序列中的,并将它传递出的初始矢量的长度。

+1

我想到如果有重复的子序列,事情就会变得毛茸茸的。 '1,2,3,1,2,3,4,5,1,2,3,1,2,3,4,5'。正如DWIN和mdrwab指出的,非单调序列可能会错误地产生“diff = 0”结果。也许你应该采取傅立叶变换,并寻找高峰:-) –

+0

@dplanet,下面的答案是如何解决你的?如果他们不这样做,你能指出你可能在寻找什么吗? – A5C1D2H2I1M1N2O1R2T1

回答

3

如果期间始终是相同的,即顺序不会改变,那么你可以使用一个循环超过lag看到匹配时。

对于总偏差,我还建议使用seqle(猜测谁写了这个函数:-)),它就像rle,但是找到了序列。 detect intervals of the consequent integer sequences 我不是编辑源“RLE”这样的人。

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)来测试你的答案,看他们是否通过了鉴别非单调重复的测试。到目前为止,他们都没有这样做;因为没有从@DWin铅报告期内7

+0

我试图识别非单调重复,但我并不是很舒服(没有以前的经验),而使用'while()(http://stackoverflow.com/a/12826587/1270695) )'。有什么建议么? – A5C1D2H2I1M1N2O1R2T1

1

大厦,你也许可以做一个函数是这样的:

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 IS非单调:

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