提问人:Nate 提问时间:4/12/2023 更新时间:4/12/2023 访问量:76
dplyr::filter 中 == 的替代项,以适应浮点数
Alternatives to == in dplyr::filter, to accomodate floating point numbers
问:
首先,我要说的是,我知道我们受到计算机算术和浮点数的限制,有时 0.8 不等于 0.8。我很好奇使用 in 或替代方法解决这个问题的方法。==
dplyr::filter
我正在处理这段正常运行的代码。它准确地筛选数据,然后按预期执行插值。
# Load necessary libraries
library(dplyr)
target_at = 0.5
# Create the data frame
data <- data.frame(
t_ov_ri = c(0, 0, 0, 0, 0, 0.01, 0.01, 0.01, 0.01, 0.01),
a_ov_c = c(2, 2, 2, 2, 2, 0.03125, 0.03125, 0.03125, 0.03125, 0.03125),
a_ov_t = c(0, 0.2, 0.4, 0.6, 0.8, 0, 0.2, 0.4, 0.6, 0.8),
gi = rep("G5", 10),
a0 = c(0.815055, 0.8463715, 0.8570045, 0.8839861, 0.9033134, 0.1116504, 0.2117479, 0.22943, 0.238598, 0.28524)
)
# Define the interpolation function
interpolate_a0 <- function(a_ov_t_low, a_ov_t_high, a0_low, a0_high, a_ov_t_target) {
interpolation_factor <- (a_ov_t_target - a_ov_t_low) / (a_ov_t_high - a_ov_t_low)
a0_target <- a0_low + interpolation_factor * (a0_high - a0_low)
return(a0_target)
}
# Apply the interpolation function to the data frame for a_ov_t equal target_ac
data_sm <- data %>% filter(a_ov_t == target_at - 0.1)
data_lg <- data %>% filter(a_ov_t == target_at + 0.1)
interpolated_data <- data.frame(
t_ov_ri = data_sm$t_ov_ri,
a_ov_c = data_sm$a_ov_c,
a_ov_t = rep(target_at, nrow(data_sm)),
gi = data_sm$gi,
a0 = mapply(interpolate_a0, data_sm$a_ov_t, data_lg$a_ov_t, data_sm$a0, data_lg$a0, rep(0.5, nrow(data_sm)))
)
# Find the min and max a_ov_c values for the interpolated data
a0_low <- min(interpolated_data$a0)
a0_high <- max(interpolated_data$a0)
如果我修改(或其他奇数值),过滤过程将无法正常工作。具体而言,代码不包括 where 中的值为 0.8,尽管 是相同的数据类型和值。target_at = 0.7
data_lg <- data %>% filter(a_ov_t == target_at + 0.1)
data
a_ov_t
target_at + 0.1 = 0.8
了解到这些数字彼此不相等,因为我的计算机存储它们的方式存在微小差异,我目前已通过以下方法解决了过滤问题:
data_lg <- data %>% filter(a_ov_t*10 == target_at*10 + 1)
现在我想知道有什么更好的替代方案可以解释浮点数并正确过滤我的数据集。
答: 暂无答案
评论
all.equal(abs(a_ov_t -target_at), 0.1)
near
abs(val1 - val2) < 1e-9
1e-9