我正在尝试对我的数据执行分段线性变换。这是一个描述转换的示例表:
dat <- data.frame(x.low = 0:2, x.high = 1:3, y.low=c(0, 2, 3), y.high=c(2, 3, 10))
dat
# x.low x.high y.low y.high
# 1 0 1 0 2
# 2 1 2 2 3
# 3 2 3 3 10
如果我定义x <- c(1.75, 2.5)
了 ,我希望转换后的值是 2.75 和 6.5(我的元素将分别与 的第 2 行和第 3 行匹配dat
)。
我知道如何for
通过循环来解决这个问题,遍历 的行dat
并转换相应的值:
pw.lin.trans <- function(x, m) {
out <- rep(NA, length(x))
for (i in seq(nrow(m))) {
matching <- x >= m$x.low[i] & x <= m$x.high[i]
out[matching] <- m$y.low[i] + (x[matching] - m$x.low[i]) /
(m$x.high[i] - m$x.low[i]) * (m$y.high[i] - m$y.low[i])
}
out
}
pw.lin.trans(x, dat)
# [1] 2.75 6.50
虽然这可行,但让我感到震惊的是,应该有一种更好的方法将x
值与行匹配dat
,然后在单个计算中执行所有插值。有人可以为我指出for
这个问题的非循环解决方案吗?