R是逻辑不连贯

use*_*648 1 if-statement r

我想基于ifs和elses使用isTRUE并且遇到困难来编写一个新的变量.我想有一个条件,如

if (isTRUE(t$a > t$b)) {
  t$c <- 0
} else if (isTRUE(t$a < t$b)) {
  t$c <- 1
} else {
  t$c <- 2
}
Run Code Online (Sandbox Code Playgroud)

请考虑以下数据:

t<-as.data.frame(c(1:5))
names(t)<-"a"
t$b<-c(5:1)
Run Code Online (Sandbox Code Playgroud)

运行上述代码给出C值一如既往为2即isTRUE(t$a > t$b)isTRUE(t$a < t$b)总是FALSE.

Spa*_*man 5

阅读帮助isTRUE:

 ‘isTRUE(x)’ is an abbreviation of ‘identical(TRUE, x)’, and so is
 true if and only if ‘x’ is a length-one logical vector whose only
 element is ‘TRUE’ and which has no attributes (not even names).
Run Code Online (Sandbox Code Playgroud)

这可能不是你想要的.

我猜你想要一个向量,t$c即0,如果t$a>t$b,1 if t$a<t$b和2否则.在R中,我们可以在单个矢量化操作中执行此操作:

设置更简单:

> t = data.frame(a=1:5, b=5:1)
> t
  a b
1 1 5
2 2 4
3 3 3
4 4 2
5 5 1
Run Code Online (Sandbox Code Playgroud)

现在如果a> b则c为0,如果a为1则为1

> t$c=2-((t$a>t$b)+(t$a!=t$b))
> t
  a b c
1 1 5 1
2 2 4 1
3 3 3 2
4 4 2 0
5 5 1 0
Run Code Online (Sandbox Code Playgroud)

逻辑运算(>,!=等等)沿着向量操作,并且数值为1评价为FALSE TRUE和0.如果您尝试键入我的表达式的一部分,t$c您应该了解这一切是如何一起工作的.

如果您不喜欢那种棘手的布尔算法,那么几个嵌套ifelse函数就可以工作:

t$c = ifelse(t$b>t$a, 1, ifelse(t$b==t$a,2,0))
Run Code Online (Sandbox Code Playgroud)

这具有更易读的优点 - 如果b> a 1,否则如果b = a其中2则为0.注意ifelse在向量的每个元素上如何工作,如许多R函数.