代码之家  ›  专栏  ›  技术社区  ›  Denis

为什么ifelse不处理复杂的测试条件?

  •  1
  • Denis  · 技术社区  · 5 年前

    所以假设我有以下几点:

    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 回复  |  直到 5 年前
        1
  •  6
  •   akrun    5 年前

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

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

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

    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 如果不是 在这里

    as.integer(v$a > 5)
    

    或者

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