【问题标题】:How to get equivalent to R ifelse functionality, using logical operators如何使用逻辑运算符获得等效于 R ifelse 的功能
【发布时间】:2013-02-06 12:38:04
【问题描述】:

请谁能告诉我如何将以下语句变成一个可以做同样事情但不使用 ifelse 的语句?

<-ifelse(y>=50, 0.2*x+0.8*y, ifelse(y<50 & x>70, y+10, ifelse(y<50 & x<70, y))) 

x=80
y=60

所以我最终的代码应该给出 64 的答案 - 选择第一个条件。然后我将对其进行测试,以确保其他 3 个条件针对不同的 x 和 y 值给出正确的结果

非常感谢。

【问题讨论】:

  • 这段代码有什么问题?
  • ifelse 怎么了? y 是向量吗? ifelseifelse 的合适替代品吗?
  • 您为什么不接受您的类似问题的任何答案? stackoverflow.com/questions/14713330/…ifelse有什么问题?
  • 是的,投票并接受答案,否则人们将停止向您提供答案。
  • 查看之前发布的问题,看起来 OP 的问题更像是一种方法。这听起来像是将所有内容打包成一行的原因,因为 OP 不知道如何创建一个循环遍历的函数或如何创建一个单一的矢量化命令来一次完成所有操作。也许提出的问题不会导致 OP 需要的答案。

标签: r operators logical-operators


【解决方案1】:

这应该可行:

finalmark <- (x * 0.2 + y * 0.8) * (y >= 50) + (y + 10 * (x > 70)) * (y < 50)

【讨论】:

  • 哈!我不知道 FALSE 在 R. Brilliant 中返回了一个数字零,先生。缺点是您总是必须对每组数字进行每次逻辑比较,但优点是您删除了逻辑块。在某些情况下,这将是闪电般的速度......我必须将它添加到我的常规工具集中。
  • 嗨,非常感谢。你一提到这一点,我就意识到我把事情搞得太复杂了
  • @Dinre 和其他人:与ifelse 相比的缺点是所有子表达式都会被计算,没有惰性计算。
【解决方案2】:

这样的?

if(y>=50){
    0.2*x+0.8*y 
     }else{
      if(y<50 & x>70){
         y+10 
          }else{ 
            if(y<50 & x<70){
               y 
              }else{
               "OMG I did not expect this scenario"
            }
        }
    }

试试:y=45; x=70 看看为什么我有最后一个条件。

【讨论】:

  • +1 for "OMG..." :-) 虽然根据 thedailywtf.com 的说法,正确的表述更像是“这永远不会发生 [OK box]”
【解决方案3】:

如果 y 是一个数字,那么一旦你测试了 y > = 50,那么 y 必须 小于 50,所以不要继续测试。同样,一旦您找到 x > 70,您就不需要最后一个 ifelse。您没有 x = 70 的回报。我的猜测是您想在那里测试 = 情况。

ifelse(y>=50, 0.2*x+0.8*y, ifelse(x>70, y+10, y)) 

在标量中

if(y >= 50){
  0.2*x+0.8*y
}else if(x > 70){
  y+10
}else y

鉴于您在一般情况下似乎很难编写逻辑,我建议您发布一个更完整的问题。有可能(很可能)您正在做一些您真的不想做的事情。

【讨论】:

    【解决方案4】:

    您可以采取多种方法。以下是构建函数“f”的几个示例,以便使用“ifelse”语句以外的逻辑来满足问题中列出的标准。 注意:我还对原始帖子添加了一项修改,因为“x=70”会破坏逻辑。我将 'x>=70' 添加到第二个标准。

    选项 1:使用标准的 'if / else if / else' 逻辑块。就个人而言,我喜欢这个选项,因为它易于阅读。

    f <- function(x, y){
        if (y>= 50){
            return(0.2*x+0.8*y)
        } else if (y < 50 & x >= 70){
            return(y+10)
        } else {
            return(y)
        }
    }
    

    选项 2:将您的两个逻辑测试(实际上只有两个)组合成一个字符串,并使用开关。请注意,最终和未命名的选项被视为“else”。

    f <- function(x, y){
        return(
            switch(paste(x >= 70, y >= 50, sep=""), 
                TRUEFALSE = y + 10, 
                FALSEFALSE = y,
                0.2*x+0.8*y 
            )
        )
    }
    

    选项 3:对“if”语句进行排序以减少逻辑比较。如果您有一个大型数据集或 非常 有限的内存,这就是要做的事情。这稍微难以解决,因为您必须阅读整个块才能完全理解它。如果您没有内存或循环限制,选项 1 会更好。

    f <- function(x, y){
        if (y >= 50){
            return(0.2*x+0.8*y)
        } else {
            if (x >=70){
                return(y+10)
            } else {
                return(y)
            }
        }
    }
    

    还有其他选择,但这些是最容易想到的。

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 2023-03-16
      • 2016-05-11
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多