2013-06-22 103 views
2

我试图用R和ifelse对R中的以下语句进行编码。样本数据是trial,x,y和z是trial的列)。在R中使用ifelse

语句使用ifelse

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,???))) 

其中被编码

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

将R代码,???指定有根据上述声明没有值。换句话说,对于x<0 and y,没有值。

接下来,我用的,如果组合和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,因为我只处理矢量。但是,在这方面我没有运气。任何想法?

回答

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 

注意,我给你NA的情况下,x < 0您可以使用一个变换像这样的例子:

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 

但个人除了您需要更改列名称之外,我更喜欢第一个可读性。

+0

感谢您使用'transform'的解决方案。 – Metrics

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人switch语句。

+0

谢谢。是否可以使用'switch'来更新您的答案?请注意,我正在执行矢量操作。 – Metrics

+1

嵌套'ifelse'可能很难遵循,但是在R中,它是一个向量化操作,很多时候性能被赋予易读性(妥协) – agstudy