Векторизованный способ найти разницу между последовательными элементами? Может быть, вариация np.diff ()? - PullRequest
1 голос
/ 20 января 2020

Я хочу найти две разности типов последовательных элементов массива. Один из них:

diff1 = [x1-x0, x2-x1, x3-x2, ...]

Этого я могу достичь, используя Функция np.diff () из библиотеки numpy. Тем не менее, другой тип различий, который я хочу:

diff2 = [x0-x1, x1-x2, x2-x3, ....]

I Можно добиться этого с помощью l oop, однако размер массива довольно велик. Есть ли векторизованная функция this?

Кроме того, я не уверен, как эти различия называются в статистике? или если есть термин для такой операции. Не зная, как называется такая операция, я не могу найти решение inte rnet.

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Использование diff в соответствии с рекомендациями @thelatemail и @ r2evans просто. Однако другой альтернативой является использование head и tail

diff1 <- tail(x, -1) - head(x, -1)
diff1
#[1]  7 -8  6 -2  3 -8  6 -2 -1

diff2 <- head(x, -1) - tail(x, -1)
diff2
#[1] -7  8 -6  2 -3  8 -6  2  1

data

set.seed(123)
x <- sample(10)
x
#[1]  3 10  2  8  6  9  1  7  5  4
2 голосов
/ 20 января 2020

Если вы ищете решение в r (как вы пометили его в своем вопросе), вы можете использовать функцию lag / lead из пакета dplyr.

Здесь, чтобы проиллюстрировать это, я создаю поддельный вектор, который я преобразую как data.frame для использования в dplyr, затем функция mutate создает новый столбец с соответствующей функцией:

set.seed(123)
df <- data.frame(A = sample(1:10,10, replace = TRUE))

library(dplyr)
df %>% mutate(Diff1 = A-lag(A), Diff2 = A-lead(A))

    A Diff1 Diff2
1   3    NA     0
2   3     0    -7
3  10     7     8
4   2    -8    -4
5   6     4     1
6   5    -1     1
7   4    -1    -2
8   6     2    -3
9   9     3    -1
10 10     1    NA

Это отвечает на ваш вопрос?

0 голосов
/ 24 января 2020

Комментарий @Divakar:

diff2 будет просто -np.diff (a) или более эффективным с [: - 1] -a [1:] с массивом.

было идеальным решением, которое я искал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...