Как получить индекс / позицию, где разница значений превышает порог? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть этот фрейм данных:

 > 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% от первого значения, то укажите позицию последнего первого значения:

Итак:

а) абс (1,839646 - 5,554302) = 3,714656

b) 50% от 1,839646 составляет 0,919823

с) 3, 714656 больше 0,919823

d) получить индекс того, где это происходит: по индексу 6 (на дату 2012-12-01)

То же самое длявторое и третье (уникальное) значение.

1 Ответ

0 голосов
/ 27 ноября 2018

Назовите ваш вектор медиан 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...