dplyr::filter 中 == 的替代项,以适应浮点数

Alternatives to == in dplyr::filter, to accomodate floating point numbers

提问人:Nate 提问时间:4/12/2023 更新时间:4/12/2023 访问量:76

问:

首先,我要说的是,我知道我们受到计算机算术和浮点数的限制,有时 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.7data_lg <- data %>% filter(a_ov_t == target_at + 0.1)dataa_ov_ttarget_at + 0.1 = 0.8

了解到这些数字彼此不相等,因为我的计算机存储它们的方式存在微小差异,我目前已通过以下方法解决了过滤问题:

data_lg <- data %>% filter(a_ov_t*10 == target_at*10 + 1)

现在我想知道有什么更好的替代方案可以解释浮点数并正确过滤我的数据集。

R 滤波器 浮动精度

评论

2赞 Onyambu 4/12/2023
你应该使用all.equal(abs(a_ov_t -target_at), 0.1)
3赞 I_O 4/12/2023
函数可能有助于解决精度问题:dplyr.tidyverse.org/reference/near.htmlnear
1赞 r2evans 4/12/2023
当我寻找浮点的近乎相等时,我经常使用 where 可能是上下文相关的(但对于大多数事情来说应该足够了)。abs(val1 - val2) < 1e-91e-9

答: 暂无答案