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

时间:2019-07-10 02:05:21

标签: 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")

为什么这样做:

ifelse(v$a > 5, 1, 0)

这不起作用:

ifelse(v$a > 5 && v$a < 8, 1, 0)

1 个答案:

答案 0 :(得分:6)

ifelse需要所有参数的长度都相同。根据{{​​1}}

  

如果是或否太短,则将其元素回收。当且仅当测试的任何一个要素为真,并且类似地为否,才会评估是。

即。如果参数之一大于1,其他参数的长度为1,则会循环使用其他参数以使长度相同。在第二种情况下,所有参数的长度都为1,如根据`?“ &&”

  

&和&&表示逻辑AND和|和||表示逻辑或。较短的形式以与算术运算符几乎相同的方式执行元素比较。较长的形式从左到右求值,仅检查每个向量的第一个元素。评估仅进行到确定结果为止。较长的形式适用于编程控制流,通常在if子句中首选。

?ifelse

同时

v$a > 5 && v$a < 8 
#[1] FALSE  # length 1

因此,这里没有回收。相反,如果我们仅使用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 ,那么它将给出预期的输出

&

此外,请注意,ifelse(v$a > 5 & v$a < 8, 1, 0) as.integer强制转换为二进制TRUE/FALSE。因此,这里不需要1/0

ifelse

as.integer(v$a > 5)