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

R 为什么ifelse不处理复杂的测试条件(和| | |/|之间的差异)?,r,dataframe,zoo,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 && v$a < 8, 1, 0) ifelse(v$a>5&&v$a5&v$a5&v$a5&v$a>8)| | v$a==4)?i、 e.as.intege

因此,假设我有以下几点:

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 && v$a < 8, 1, 0)
ifelse(v$a>5&&v$a<8,1,0)

ifelse需要所有参数的长度相同。根据
?ifelse

如果“是”或“否”太短,则它们的元素将被回收。当且仅当任何测试元素为真时,才会评估“是”,与否类似

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

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


另外,请注意,
as.integer
TRUE/FALSE
强制为二进制
1/0
。因此,这里不需要
ifelse

as.integer(v$a > 5)

as.integer(v$a>5&v$a<8)

ifelse需要所有参数的长度相同。根据
?ifelse

如果“是”或“否”太短,则它们的元素将被回收。当且仅当任何测试元素为真时,才会评估“是”,与否类似

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

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


另外,请注意,
as.integer
TRUE/FALSE
强制为二进制
1/0
。因此,这里不需要
ifelse

as.integer(v$a > 5)

as.integer(v$a>5&v$a<8)

Because
&&
返回单个真/假Because
&&
返回单个真/假如果您意外地将它们混合在一起会怎样?i、 e.
as.integer((v$a>5&v$a>8)| | v$a==4)
?i、 e.
as.integer((v$a>5&v$a>8)| v$a==4)
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(v$a > 5)
as.integer(v$a > 5 & v$a < 8)