2012-06-06 163 views
2

我有以下类型的数据条件ifelse r中

ex1 <- data.frame (A = 1:6, B = c(1,2,3,5,1,1), qit = c(1,2,1,2,5,1)) 
ex1 
A B qit 
1 1 1 1 
2 2 2 2 
3 3 3 1 
4 4 5 2 
5 5 1 5 
6 6 1 1 

的我尝试以下ifelse循环,但不是占有我需要..

ifelse (ex1[1] == ex1[2] & ex1$qit, 1, 
     ifelse (ex1[1]== ex1$qit || ex1[2]== ex1$qit, 0.5, 
      NA)) 

条件是:

(1) If A = B = qit , then output 1 (else) 

(2) Either A = qit or B = qit then output = 0.5 (else) 

(3) If none of above conditions hold output NA 

我认为我有使用&的问题,但我试过ex1 [1] == ex1 [2] == ex1 $ qit给出错误。

预期输出:

ex1$out <- c(1, 1, NA, NA, 0.5, 0.5) 
A B qit out 
1 1 1 1 1.0 
2 2 2 2 1.0 
3 3 3 1 NA 
4 4 5 2 NA 
5 5 1 5 0.5 
6 6 1 1 0.5 

阐释了解决方案:

Soultion for the first row: 
A = B = qit all conditions hold true so the output 1 

For second row 
A = B = qit all conditions hold true so the output 1 

For third row 
A = B but not equal to qit output NA 

For fourth row 
A is not equal to B nor equal to qit output NA 

Fifth row 
A = qit (however A = B = qit doesnot hold true) so output 0.5 

Sixth row 
B = qit (however A = B = qit doesnot hold true) so output 0.5 

回答

8
ifelse (ex1[1] == ex1[2] & ex1[1] == ex1$qit, 1, 
     ifelse (ex1[1] == ex1$qit | ex1[2] == ex1$qit, 0.5, 
       NA)) 
5

您需要组中的第一条,你不能在左侧或右侧的多个选项一个比较运算符,如==。所以第一个条款应该是A == B & B == qit

> with(ex1, ifelse(A == B & B == qit, 1, ifelse(A == qit | B == qit, 0.5, NA))) 
[1] 1.0 1.0 NA NA 0.5 0.5 

,我用with()避免一切杂乱ex1$位:

整个事情可以如下完成。

将结果添加为新列out,请使用以下两种方法之一:

ex1 <- transform(ex1, out = ifelse(A == B & B == qit, 1, 
            ifelse(A == qit | B == qit, 0.5, NA))) 

ex1 <- within(ex1, out <- ifelse(A == B & B == qit, 1, 
           ifelse(A == qit | B == qit, 0.5, NA)))