【问题标题】:Match all logic rules with a matrix and in the same order以相同的顺序将所有逻辑规则与矩阵匹配
【发布时间】:2021-06-03 11:53:30
【问题描述】:

例如,我有一个这样的矩阵

dat <- cbind(1:10,11:20,21:30)
colnames(dat) <- paste0("x",1:ncol(dat))
dat
      x1 x2 x3
 [1,]  1 11 21
 [2,]  2 12 22
 [3,]  3 13 23
 [4,]  4 14 24
 [5,]  5 15 25
 [6,]  6 16 26
 [7,]  7 17 27
 [8,]  8 18 28
 [9,]  9 19 29
[10,] 10 20 30

我也有一个带有逻辑规则的向量,比如这样

pat <- c("x1>1 & x2>12","x3>25","x1<x3 & x3>28")
pat
[1] "x1>1 & x2>12"       "x3>25"         "x1<x3 & x3>28"

我需要检查矩阵以执行规则,并且规则应该按照它们在向量中指定的顺序工作。 为了更好的理解,我会画

因此,我想得到一个函数,它接受两个参数,一个矩阵dat 和一个带有规则pat 的向量,并返回真/假。

如果有人愿意帮助我,我会很高兴

UPD========================================

我并不总是从函数f1 得到正确答案,可能是什么问题?

f1 <- function(pat, dat) {
  tmp <-  suppressWarnings(lapply(pat, function(x) 
    min(which( with(as.data.frame(dat), 
                    eval(parse(text = x)))))))
  tmp1 <- unlist(tmp)
  i1 <- any(sapply(tmp, is.infinite))
  if(i1) FALSE else identical(tmp1, sort(tmp1))
}

一些假数据

set.seed(25641)
dat <- matrix(data = sample(10,20,replace = T),ncol = 3)
colnames(dat) <- paste0("x",1:ncol(dat))

pat <- c("x1>5","x2>x1","x3>1")

> dat
     x1 x2 x3
[1,]  4  4  7
[2,]  9  3  4
[3,]  7  9  5
[4,]  3  2 10
[5,] 10  7 10
[6,]  5  6  4
[7,]  9  9  4

根据数据可以看出,函数f1应该返回TRUE,但是返回的是FALSE

f1(pat = pat,dat = dat)
[1] FALSE

【问题讨论】:

    标签: r matrix sequence rules


    【解决方案1】:

    这是一个循环遍历模式的函数,将 matrix 转换为 data.frame,而 evaluating 表达式,if 在评估后没有 TRUE 值返回 FALSE,否则检查 @987654326 @min 索引与sorted 相同

    f1 <- function(pat, dat) {
       tmp <-  suppressWarnings(lapply(pat, function(x) 
           min(which( with(as.data.frame(dat), 
               eval(parse(text = x)))))))
       tmp1 <- unlist(tmp)
       i1 <- any(sapply(tmp, is.infinite))
       if(i1) FALSE else identical(tmp1, sort(tmp1))
     }
       
    f1(pat, dat)
    #[1] TRUE
    

    为了更新

    pat <- c("x1>1 & x2>12","x3>25","x1<x3 & x3>48")
    f1(pat, dat)
    #[1] FALSE
    

    【讨论】:

    【解决方案2】:

    请注意,如果一个或多个条件不满足,这将返回 FALSE

    f <- function(dat, pat){
      list2env(as.list.data.frame(data.frame(dat)), environment())
      m <- do.call(cbind, lapply(pat, function(x) eval(parse(text = x))))
      ifelse(all(apply(m, 2, any)), Reduce("<", apply(m, 2, which.max)), F)
    }
    

    输出

    pat <- c("x1>1 & x2>12","x3>25","x1<x3 & x3>28")
    
    f(dat, pat)
    [1] TRUE
    
    
    pat <- c("x1<1 & x2>12","x3>25","x1<x3 & x3>28") # first condition not met
    
    f(dat, pat) 
    [1] FALSE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 2018-04-20
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多