0

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

4 回答 4

4

这应该有效:

finalmark <- (x * 0.2 + y * 0.8) * (y >= 50) + (y + 10 * (x > 70)) * (y < 50)
于 2013-02-06T13:22:37.937 回答
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看看为什么我有最后一个条件。

于 2013-02-06T13:01:39.440 回答
1

如果 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

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

于 2013-02-06T13:17:37.043 回答
0

您可以采取多种方法。下面是构建函数“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:将您的两个逻辑测试(实际上只有两个)组合成一个字符串,并使用一个开关。请注意,最终和未命名的选项被视为“其他”。

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)
        }
    }
}

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

于 2013-02-06T13:20:14.430 回答