【问题标题】:How to set margin of error for conditional all statement如何为条件所有语句设置误差范围
【发布时间】:2020-04-02 00:33:26
【问题描述】:

我正在尝试创建一个条件语句来检查某些值是否都存在于另一个向量中,但我想修改条件语句,以便存在满足条件偏差的误差范围(我正在尝试以避免浮点数)。这是一个例子

x1= 2.595

x2= 4.231

x3=3.236

x= c(2.592,3.64,3.235, 5.33,4.229)

if(all(c(x1,x2,x3) %in% x)){print("pls help")}

关于如何修改上述条件语句以留出一些余地的任何想法?这样x1,x2,x3 不必完全等于x 中的任何值才能使条件为真?

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    使用相同的容差方法,您可以定义一个自定义的%in%-like 函数,内置容差:

    `%in_tol%` <- function(x, y, tol = .005) colSums(abs(sapply(x,`-`, y)) <= tol) > 0
    
    y <- c(2.595, 4.231, 3.236)
    x <- c(2.592, 3.64, 3.235, 5.33, 4.229)
    
    y %in_tol% x
    [1] TRUE TRUE TRUE
    

    或降低公差:

    `%in_tol%`(y, x, tol = .002)
    [1] FALSE  TRUE  TRUE
    

    【讨论】:

      【解决方案2】:

      您可以定义一个threshold,建立一个上限和下限并与这些值进行比较。

      threshold <- 0.05
      lower_limit <- x - threshold
      upper_limit <- x + threshold
      
      all(sapply(c(x1, x2, x3), function(y) any(y >= lower_limit & y <= upper_limit)))
      #[1] TRUE
      

      【讨论】:

      • 这看起来很有希望。请问sapplyfunction(y)在这种特殊情况下在做什么?
      • 我还假设y 只是一个任意占位符,对吗?使用y 没什么特别的
      • sapply 迭代每个值 x1x2x3 一次一个,是的,y 只是一个占位符,用于对来自的值应用匿名函数sapply.
      • 谢谢。最后一个问题:sapply 一次迭代每个x1,x2,x3,但仍然存在所有这些对象必须存在于x 中(至少在误差范围内)才能使声明为真的情况对吗?
      • 是的,因为我们在sapply之外使用了allall(sapply(c(x1...... 所以所有的x1x2x3 都必须在声明为 TRUE 的范围内。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 2011-02-02
      • 2012-05-22
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多