因此,假设我有以下内容:
library(zoo)
v <- read.zoo(data.frame(dt=as.Date('2011-01-01')+0:9, a=1:10, b=11:20, c=21:30), index.column = "dt")
Run Code Online (Sandbox Code Playgroud)
为什么这样做:
ifelse(v$a > 5, 1, 0)
Run Code Online (Sandbox Code Playgroud)
这不起作用:
ifelse(v$a > 5 && v$a < 8, 1, 0)
Run Code Online (Sandbox Code Playgroud)
将ifelse需要的所有参数是相同的长度。根据?ifelse
如果是或否太短,则将其元素回收。当且仅当测试的任何元素为真时,才对“是”进行评估,类似地,对“否”进行评估。
即。如果参数之一大于1,其他参数的长度为1,则会循环使用其他参数以使长度相同。在第二种情况下,所有参数的长度都为1,如根据`?“ &&”
&和&&表示逻辑AND和| 和|| 表示逻辑或。较短的形式以与算术运算符几乎相同的方式执行元素比较。较长的形式从左到右求值,仅检查每个向量的第一个元素。评估仅进行到确定结果为止。较长的形式适用于编程控制流,通常在if子句中首选。
v$a > 5 && v$a < 8
#[1] FALSE # length 1
Run Code Online (Sandbox Code Playgroud)
而
v$a > 5 & v$a < 8
#2011-01-01 2011-01-02 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 2011-01-08 2011-01-09 2011-01-10
# FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
因此,这里没有回收。相反,如果&仅使用它,它将给出预期的输出
ifelse(v$a > 5 & v$a < 8, 1, 0)
Run Code Online (Sandbox Code Playgroud)
另外,请注意将as.integer强制转换TRUE/FALSE为binary 1/0。因此,有没有必要ifelse在这里
as.integer(v$a > 5)
Run Code Online (Sandbox Code Playgroud)
要么
as.integer(v$a > 5 & v$a < 8)
Run Code Online (Sandbox Code Playgroud)