【问题标题】:Using ifelse in R在 R 中使用 ifelse
【发布时间】:2013-06-19 14:11:17
【问题描述】:

我正在尝试使用ififelse 在 R 中编写以下语句。示例数据是试验,x、y 和 z 是试验列。

要编码的语句

if (x>0) {
      if (y>0) {
          l=2
       }else{
           l=5
       }
      if (z>0) {
          m=l+2
       }else{
           m=5
       }
}

使用 ifelse 的 R 代码

trial$l<-with(trial, ifelse((x>0 &y>0),2,ifelse((x>0 &y<=0),5,???)))
trial$m<-with (trial,ifelse((x>0 &z>0),l+2,ifelse((x>0 &z<=0),5,???)))

其中,??? 指定根据上面的语句没有值。换句话说,x&lt;0 and y 没有值。

接下来,我结合使用 if 和 ifelse 来查看是否有效:

if(trial$z>0){
    trial$l<-with(trial, ifelse(y>0,2,5))
    trial$m<-with(trial, ifelse(z>0,l+2,5))
}

这段代码没问题但是有警告信息(因为z是一个列向量)

In if (trial$z>0){
the condition has length>1 and only the first element will be used

我只想专注于使用ifelse,因为我只处理矢量。但是,我在这方面没有运气。有什么想法吗?

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    如果你想使用 ifelse 和嵌套的东西,你可以这样做

    test <- data.frame(x = 2, y = 5, z = 3)
    with(test, ifelse(z > 0 & x > 0 | y > 3, "yes", "no"))
    

    在这种情况下,您使用逻辑运算符来保护输出。如果z &lt;= 0,你仍然会得到“不”,但你可以很容易地处理它。

    with(test, ifelse(z > 0, ifelse(x > 0 | y > 3, "yes", "no"), NA))
    

    嵌套的ifelse 语句在任何语言中都难以理解,因此如果您最终得到超过 3 个语句,请考虑匹配或切换语句。

    【讨论】:

    • 谢谢。您是否可以使用switch 更新您的答案?请注意,我正在执行矢量运算。
    • 嵌套的ifelse 可能很难理解,但在 R 中,它是一个矢量化操作,所以很多时候性能优先于可读性(妥协)
    【解决方案2】:

    例如,我会使用两次transform

    trial <- data.frame(x=c(-1,1,2),y=c(1,-2,3),z=c(1,-5,5))
    trial <- transform(trial,l = ifelse(x>0,ifelse(y > 0,2,5),NA))
    transform(trial,m = ifelse(x>0,ifelse(z>0,l+2,5),NA))
    
       x  y  z  l  m
    1 -1  1  1 NA NA
    2  1 -2 -5  5  5
    3  2  3  5  2  4
    

    请注意,我为 case x

    trial <- data.frame(x=c(-1,1,2),y=c(1,-2,3),z=c(1,-5,5))
    transform(trial,l <- ifelse(x>0,ifelse(y > 0,2,5),NA),
                             m = ifelse(x>0,ifelse(z>0,l+2,5),NA))
      x  y  z c.NA..5..2.  m
    1 -1  1  1          NA NA
    2  1 -2 -5           5  5
    3  2  3  5           2  4
    

    但我个人更喜欢第一个,因为您可能需要更改列名。

    【讨论】:

    • 感谢transform 提供的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2020-03-21
    • 2013-04-30
    相关资源
    最近更新 更多