所以假设我有以下内容:
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)
答案 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)