データの区分的線形変換を実行しようとしています。変換を説明する表の例を次に示します。
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 になると予想されます (私の要素はdat
それぞれ の 2 行目と 3 行目に一致します)。
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
、すべての補間を 1 回の計算で実行する、より良いアプローチがあるはずです。誰かfor
がこの問題の非ループ解決策を教えてくれませんか?