2

我正在尝试用if和在 R 中编写以下语句ifelse。示例数据是试验,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<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因为我只处理矢量。但是,我在这方面没有运气。任何的想法?

4

2 回答 2

4

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

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

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

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

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

于 2013-06-22T16:01:35.833 回答
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 < 0 分配了 NA。您可以使用这样的一个转换,例如:

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

但就我个人而言,除了您可能需要更改列名之外,我更喜欢第一个以提高可读性。

于 2013-06-22T17:03:51.507 回答