我想基于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.
阅读帮助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函数.