如何获得值差超过阈值的索引/位置?

时间:2018-11-27 14:13:00

标签: r

我有这个数据框:

 > 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)

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

1 个答案:

答案 0 :(得分:1)

称中位数为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