2016-02-29 70 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