2017-07-31 37 views
2

我有一個數據源在某個未知間隔有重複值,爲了使事情更加複雜,數據重複的次數可能不是整數。這是一個人爲的例子:查找不同編號的重複序列

set.seed(1) 
Values <- sample(1:10,10,replace=T) 
Values 
[1] 3 4 6 10 3 9 10 7 7 1 

CombinedValues <- c(Values,Values,Values[1:5]) 
[1] 3 4 6 10 3 9 10 7 7 1 3 4 6 10 3 9 10 7 7 1 3 4 6 10 3 

我的問題是,因爲我們不知道一個有效的方式給出的矢量CombinedValues什麼是獲得最長的重複「模式」的最有效的方式(又名Values)重複的向量是多久?我期望的輸出或者是矢量Values或描述模式重複位置的索引。

現有的軟件包是否已具備此功能?

澄清

  • 數據源只包含重複序列

  • 重複的圖案至少兩次

  • 我們也知道,該數據與模式開始。

  • 該模式不重疊。所以期望的輸出是最長的非重疊模式。

+2

提供隨機數字時,請包含對'set.seed'的調用。 – Roland

+0

另外,預期產出是多少? 2? – Roland

+0

編輯爲擁有種子和預期產出。 –

回答

1
set.seed(1) 
Values <- sample(1:10,10,replace=T) 
CombinedValues <- c(Values,Values,Values[1:5]) 

max_seq <- function(x) 
{ 
    max_seq_len=0 
    for(i in 1:floor(length(x)/2)) 
    { 
    y = split(x, ceiling(seq_along(x)/i)) 
    lengths=sapply(y,length) 
    if(length(unique(y[which(lengths==max(lengths))]))==1) 
    {max_seq_len=i} 
    } 
    return(max_seq_len) 
} 

max_seq(CombinedValues) 

這將返回10,和CombinedValues[1:max_seq(CombinedValues)]回報你的數組:

[1] 3 4 6 10 3 9 10 7 7 1 

希望這有助於。

+1

謝謝,這個作品非常好。我會接受你的回答,並添加我自己的哈克解決方案作爲另一個。 –

0

我發現的解決方案是使用zoo包中的rollapply。我假設該模式至少有一定的長度,並且獲得錯誤肯定匹配的可能性很低。

which(rollapply(CombinedValues, 4, FUN=function(x) all(x == Values[1:4]))) 

在這種情況下,獲得4個匹配是一行不具有低假陽性概率。然而在數據可以增加4到1000的數據中,這很好地解決了問題。