Найдите середины между значениями в векторе

Это функция для вычисления AUC с использованием правила средней точки. Как с помощью R определить вектор, содержащий средние точки между значениями предыдущего вектора? Или как я могу переместить значения вектора в их средние точки?

# define h (or delta x)
  h <- (b - a) / n
# define vector based on the limits of integration, a to b by increments of h
  xj <- seq.int(a, b, length.out = n + 1
# shift values of vector to their midpoints

Например, чтобы сдвинуть значения [0, 1, 2, 3] на [.25, 1.5, 2.5]

Этот цикл for работает, но мне интересно, есть ли более элегантное решение, чем это:

for (i in 1:length(xj)) {
  xji[i] <- (xj[i] + xj[i + 1]) / 2
}

person abk    schedule 31.03.2018    source источник
comment
Вы имели в виду 0,5 вместо 0,25?   -  person Evan Friedland    schedule 02.04.2018


Ответы (4)


Мы можем использовать скользящее среднее

library(zoo)
rollmean(v1, 2)
#[1] 0.5 1.5 2.5

данные

v1 <- 0:3
person akrun    schedule 31.03.2018
comment
идеально! именно то, что я искал, что-то более плавное, чем цикл for - person abk; 31.03.2018
comment
@abk Добро пожаловать в переполнение стека! Поблагодарите пользователей, которые ответят на ваши вопросы, отметив свой ответ как ответ и проголосовав за, если у вас есть такая привилегия. stackoverflow.com/help/someone-answers - person De Novo; 31.03.2018

Чтобы предоставить базовый ответ R, можно использовать функцию approx, которая будет линейно интерполировать (по умолчанию) заданное количество точек.

v <- c(0,1,2,3)
z <- approx(v, n = length(v)*2 - 1)$y
z
# [1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0
z[-which(z %in% v)]
# [1] 0.5 1.5 2.5
person Evan Friedland    schedule 02.04.2018

Другое решение:

vec <- 0:3
vec[-length(vec)] + diff(vec) / 2
person Dan Lewer    schedule 11.01.2019

Вы можете легко сделать это с помощью пакета RcppRoll:

require(RcppRoll)

vec <- 0:3
vec2 <- c(1, 3, 5, 7, 8, 10)

roll_mean(vec, n = 2)
# [1] 0.5 1.5 2.5
roll_mean(vec2, n = 2)
# [1] 2.0 4.0 6.0 7.5 9.0
person Anonymous    schedule 31.03.2018