2012-10-10 30 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