如何使用逻辑运算符等效于R ifelse功能

时间:2013-02-06 12:38:04

标签: r operators logical-operators

任何人都可以建议我如何将以下声明变成一个会做同样的事情但不使用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

的变化值给出正确的结果

非常感谢。

4 个答案:

答案 0 :(得分:4)

这应该有效:

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

答案 1 :(得分:1)

这样的东西?

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了解为什么我有最后一个条件。

答案 2 :(得分:1)

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

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

鉴于你似乎很难写出逻辑,我建议你发一个更完整的问题。你可能(很可能)在这里做了一些你真的不想做的事情。

答案 3 :(得分:0)

您可以采取几种方法。下面是构建函数'f'的几个示例,因此'f(x,y)'使用除'ifelse'语句之外的逻辑来满足问题中列出的条件。 注意:我还在原帖中添加了一个修正案,因为'x = 70'会破坏逻辑。我将'x&gt; = 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 :将两个逻辑测试(实际上只有两个)组合成一个字符串,并使用一个开关。请注意,final和unnamed选项被视为'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)
        }
    }
}

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