为什么ifelse不处理复杂的测试条件(&& /&&和|| / |之间的差异)?

Den*_*nis 0 r dataframe zoo

因此,假设我有以下内容:

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)

akr*_*run 6

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)