如何在R

时间:2016-12-20 00:46:50

标签: r convergence

假设我有以下向量:

vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28)

你会注意到有三个重复元素(25,24和28)。如何在向量中存在重复元素(或循环)时让R识别?无论有多少元素重复(2或5而不是3),无论有多少元素进入向量,我都想检测到它。

对于上下文,我有一个算法试图收敛一个值,但有时它会陷入这个重复循环。我希望R检测它何时卡在这个无限循环中然后离开。我的示例中的vec是每次迭代时的值的日志。

我已经弄清楚如何捕捉双重复元素(保存上一次迭代的值以与当前迭代进行比较),但这3个重复元素让我感到困惑。

3 个答案:

答案 0 :(得分:1)

此功能将查找2次重复的模式。我通过将第二个乘以" 100"来计算元素[i]与[i + 1]对的散列。并添加到第一个。您可以将此因子更改为其他数字,假设您的整数受该因子的限制。您可能希望将其更改为1000000.如果您有大整数,则可能需要重新考虑它。

然后我希望确保散列都是唯一的,即从[i]到[i + 1]的转换只发生一次。

hasCycle <- function(v) {
  hash <- v[1:length(v)-1] + 100 * v[2:length(v)]
  length(unique(hash)) != length(hash)
}

这是我的考试

> a <- c(1, 2,3,4,5,1,6,7)
> hasCycle(a)
[1] FALSE
> 
> b <- c(1, 2,3,4,5,9,7,3,4)
> hasCycle(b)
[1] TRUE

答案 1 :(得分:0)

在运行分析之前,请使用duplicated()方法。如果返回向量的长度为0,则没有重复。

答案 2 :(得分:0)

这可行:

如果我允许vec再运行一段时间:

vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28)

然后我可以找到长达10个元素的循环。通过改变10可以加入更长的周期,但我希望永远不必处理这个问题!

any(sapply(1:10, function(i) all(tail(diff(vec, lag = i), 10) == 0)))