代码之家  ›  专栏  ›  技术社区  ›  mr.T

将所有逻辑规则与向量按相同顺序匹配

  •  0
  • mr.T  · 技术社区  · 5 年前

    我有一个取两个向量的函数

    1. 逻辑规则的向量 pat
    2. 数据向量 dat

    该函数检查所有规则是否已执行且顺序正确

    dat <- 1:100
    pat <- c( "dat<4 & dat>2", "dat>6", "dat>99" )
    
    yes.seq.rule <- function(pat , dat){
      lv <- rep(F,length(pat))
      k <- 1
      for(i in 1:length(dat)){
          res <- eval(parse(text = pat[k]))[i]
          if(res) 
          {
            lv[k] <- TRUE
            k <- k+1 
          }
        if(k==length(pat)+1) break
      }
      return(  all(lv)  )
    }
    

    该函数返回true/false

    here 完全相同的问题是用完全相同的函数问的,唯一的区别是在这个问题中向量 拍打

    1 回复  |  直到 5 年前
        1
  •  1
  •   akrun    5 年前

    这里有一个选项,它只在表达式上循环,而不是在数据上循环

    f1 <- function(pat, dat) {
       tmp_lst <- lapply(pat, function(x) {
                i1 <- eval(parse(text = x))
                  if(any(i1)) min(which(i1))
           })
       if(!any(sapply(tmp_lst, is.null))) {
            tmp <- unlist(tmp_lst)
            identical(tmp, sort(tmp))
        } else FALSE
     }
       
    
    f1(pat, dat)
    #[1] TRUE
    

    环游世界 pat lapply eval 去吧,去拿 min imum索引,在只有 FALSE 案例,即如果有任何模式返回所有FALSE,则结果为FALSE, unlist 并检查它是否正确 identical sort

    基准

    pat <- c( "dat<4 & dat>2", "dat>6", "dat>199", "dat>1e7" )
    dat <- 1:1000000
    system.time(f1(pat, dat))
    #  user  system elapsed 
    # 0.036   0.005   0.042