首页 > 解决方案 > 如何获取值差异超过阈值的索引/位置?

问题描述

我有这个数据框:

 > new
        group       date      median
    1    1       2012-07-01  1.839646
    2    1       2012-08-01  1.839646
    3    2       2012-09-01  1.839646
    4    2       2012-10-01  1.839646
    5    3       2012-11-01  1.839646
    6    3       2012-12-01  1.839646
    7    4       2013-01-01  5.554302
    8    4       2013-02-01  5.554302
    9    5       2013-03-01  5.554302
    10   5       2013-04-01  5.554302
    11   6       2013-05-01  5.554302
    12   6       2013-06-01  5.554302
    13   7       2013-07-01  2.226150
    14   7       2013-08-01  2.226150
    15   8       2013-09-01  2.226150
    16   8       2013-10-01  2.226150
    17   9       2013-11-01  2.226150
    18   9       2013-12-01  2.226150

我现在想要做的是,我想比较中间值,如果例如第一个和第二个唯一值的差异超过某个限制,那么给我发生这种情况的位置。

一步一步: 在这个例子中,我有三个唯一的中值(1.839646,5.554302,2.226150)

1) 比较第一个和第二个唯一值。如果差值大于(例如)第一个值的 50%,那么给我最后一个值的位置:

所以:

a) abs(1.839646 - 5.554302) = 3,714656

b) 1.839646 的 50% 是 0.919823

c) 3,714656 大于 0.919823

d)获取发生这种情况的索引:索引 6(日期为 2012-12-01)

第二个和第三个(唯一)值相同。

标签: r

解决方案


调用您的中位数向量x

# sample data
x = rep(c(1.839646,5.554302,2.226150), each = 6)
which(c(0, abs(diff(x))) > 0.5 * x) - 1
# [1] 6 12

演示您的数据:

new = read.table(text = "        group       date      median
    1    1       2012-07-01  1.839646
    2    1       2012-08-01  1.839646
    3    2       2012-09-01  1.839646
    4    2       2012-10-01  1.839646
    5    3       2012-11-01  1.839646
    6    3       2012-12-01  1.839646
    7    4       2013-01-01  5.554302
    8    4       2013-02-01  5.554302
    9    5       2013-03-01  5.554302
    10   5       2013-04-01  5.554302
    11   6       2013-05-01  5.554302
    12   6       2013-06-01  5.554302
    13   7       2013-07-01  2.226150
    14   7       2013-08-01  2.226150
    15   8       2013-09-01  2.226150
    16   8       2013-10-01  2.226150
    17   9       2013-11-01  2.226150
    18   9       2013-12-01  2.226150", header = TRUE)

results = which(c(0, abs(diff(new$median))) > 0.5 * new$median) - 1
results
# [1] 6 12
new$date[results]
# [1] 2012-12-01 2013-06-01

推荐阅读