查找向量中值之间的中点
Find midpoints between values in vector
这是一个使用中点规则计算 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
}
我们可以使用滚动平均值
library(zoo)
rollmean(v1, 2)
#[1] 0.5 1.5 2.5
数据
v1 <- 0:3
您可以使用 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
为了提供基本的 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
另一个解决方案:
vec <- 0:3
vec[-length(vec)] + diff(vec) / 2
这是一个使用中点规则计算 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
}
我们可以使用滚动平均值
library(zoo)
rollmean(v1, 2)
#[1] 0.5 1.5 2.5
数据
v1 <- 0:3
您可以使用 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
为了提供基本的 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
另一个解决方案:
vec <- 0:3
vec[-length(vec)] + diff(vec) / 2