2016-02-29 65 views
0

試想一個整數向量像這樣:在數值向量確定重複模式R中的模糊搜索

> rep(c(1,4,2),10) 
[1] 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2 

對於我們人類似乎很容易識別模式1 - 不知道的功能,甚至2 - 4矢量是如何創建的。但是,如何使用R來識別這種模式?

編輯

由於這個問題被標記爲欺騙我要去指定它一下。上面的例子很容易解釋這個想法。主要目標是識別更多隱藏模式,如1 4 2 5 6 7 1 4 2 9 1 4 2 3 4 5 1 4 2以及與1 4 2 1 4 1.99 1 4 2 1.01 4 2 1 4.01 2大致相同的模式。有什麼想法總是在這些情況下識別模式1 4 2

+1

如果有什麼有其他數字也向量與重複圖案沿? – akrun

+0

你是說'1 4 2 1 4 2 * 5 * 1 4 2'?更好的是仍然能夠識別模式。然而,作爲第一步,我認爲上面的例子可能更容易。 – Peter

+2

請定義'pattern'是什麼。如果你想翻譯人腦可能認爲是計算機程序中的「模式」,你的研究可以永遠持續下去。 – nicola

回答

2

假設子模式必須從開始處開始並重復到輸入的末尾,請嘗試子模式的長度爲k = 1,2,3 ...我們假定只有長度爲一半的模式輸入以下的是要考慮:

for(k in seq_len(length(x)/2)) { 
    pat <- x[1:k] 
    if (identical(rep(pat, length = length(x)), x)) { 
     print(pat) 
     break 
    } 
} 
## [1] 1 4 2 

注:這被用作輸入x

x <- rep(c(1, 4, 2), 10) 
+0

這是一個聰明的主意!如果從頭開始,它肯定會找到重複模式。因爲它回答了我想給你的原始問題。但是,對於更高級的搜索,這也是可能的,例如上面的@PierreLafortune示例。就像一個「隱藏」模式?或者模式的「模糊」版本,例如'1 4 2 1 4 1.99 1 4 2 1.01 4 2 1 4.01 2'? – Peter

+0

預處理'x'可以移除任何顯示'm'次或更少的數字。 'm = 1'可以用你的榜樣。因此,如果我們在%names(table(x)[table(x)> m])]中使用'x < - x [x%'',然後應用算法,它將起作用。 –

+0

這不會有訣竅。在此之後,我得到序列'1 4 2 1 4 1 4 2 4 2 1 2'。當然,應用算法會給我什麼都沒有,因爲序列的前半部分不等於第二部分。我錯過了什麼嗎? @ G.Grothendieck – Peter