假设我有以下向量:
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个重复元素让我感到困惑。
答案 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)))