【问题标题】:Extract clusters of similar continuous numbers from vectors从向量中提取相似连续数的簇
【发布时间】:2018-09-12 16:09:33
【问题描述】:

我正在尝试进行一项分析,该分析需要提取一些(2 或 3)个连续值,稍后在其中执行进一步分析。

我有两个向量:a 是连续蜂窝信号机器的输出。 b 是相同的输出,但偏移了 1。此符号用于理解一个信号与下一个信号之间的可变性

a <- c(150, 130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181)
b <- c(130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181, 130)

我要做的是在这组数据中识别出最同质(稳定)的区域(即一个值类似于以下)。

我的想法是在ab 之间进行减法并考虑绝对值:

c <- abs(a-b)

给了

c

 [1] 20  5 45  2  8  2  7 25 30 20 10 50  1 51

现在,如果我想要 3 个最接近的连续点,我可以清楚地看到序列 2 8 2 是迄今为止我会考虑的序列,但我不知道如何自动提取这 3 个值,尤其是来自数百个数据点的数组。

【问题讨论】:

    标签: r


    【解决方案1】:

    初始数据:

    a <- c(150, 130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181)
    b <- c(130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181, 130)
    

    求两个向量之间的绝对差:

    res <- abs(a - b)
    

    对于res 中的每个元素,获取邻居并计算绝对差的总和:

    # with res[(x-1):(x+1)] we extract x and it's neighbors 
    resSimilarity <- sapply(seq_along(res), function(x) sum(res[(x-1):(x+1)]))
    
    resPosition <- which.min(resSimilarity)
    # [1] 5
    

    要从原始向量中提取值,请使用:

    a[(resPosition - 1):(resPosition + 1)]
    # [1] 180 182 190
    b[(resPosition - 1):(resPosition + 1)]
    # [1] 182 190 188
    

    【讨论】:

    • 感谢您的回复。我可能以错误的方式提出问题。使用您建议的方法,我可以获得 8,而我希望获得原始值(即 180、182、190)或它们在向量中的位置,因此我可以使用它们的位置来提取 a 中的值我正在分析的轨迹中的“稳态”区域。这可能吗?
    【解决方案2】:

    这是另一种选择:

    a <- c(150, 130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181)
    b <- c(130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181, 130)
    
    res <- abs(a-b)
    
    > which.min(diff(c(0, cumsum(res)), lag=3))
    [1] 4
    > res[(4):(4+2)]
    [1] 2 8 2
    

    上面的代码使用cumsum 来获得绝对差的累积和。然后它用lag=3 调用diff 以获取每个元素与距离它3 个位置的元素之间的差异。最后它占据了连续3个元素的累积和增加最小的位置。

    【讨论】:

    • 嗨,这并没有给我你得到的相同输出。我从“which.min(c(0, diff(cumsum(res)), lag=3))”命令中获得“1”,而不是“4”
    • @Mollan 抱歉,在错误的地方添加了一个),现在应该是正确的。
    • 谢谢,它成功了。在您的代码中添加一些内容,我可以提取原始向量中的位置 :) 谢谢!
    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多