SHR*_*ram 2 loops if-statement 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
Run Code Online (Sandbox Code Playgroud)
我尝试了以下ifelse循环,但没有考虑我需要的东西..
ifelse (ex1[1] == ex1[2] & ex1$qit, 1,
ifelse ( ex1[1]== ex1$qit || ex1[2]== ex1$qit, 0.5,
NA))
Run Code Online (Sandbox Code Playgroud)
条件是:
(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
Run Code Online (Sandbox Code Playgroud)
我想我有使用&的问题,但我试过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
Run Code Online (Sandbox Code Playgroud)
解决方案的解释:
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
Run Code Online (Sandbox Code Playgroud)
ifelse (ex1[1] == ex1[2] & ex1[1] == ex1$qit, 1,
ifelse ( ex1[1] == ex1$qit | ex1[2] == ex1$qit, 0.5,
NA))
Run Code Online (Sandbox Code Playgroud)
您需要对第一个子句进行分组,因为在比较运算符的左侧或右侧不能有多个选项==.所以第一个条款应该是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
Run Code Online (Sandbox Code Playgroud)
在哪里我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)))
Run Code Online (Sandbox Code Playgroud)