R 将所有逻辑规则与矩阵按相同顺序匹配

R 将所有逻辑规则与矩阵按相同顺序匹配,r,matrix,sequence,rules,R,Matrix,Sequence,Rules,例如,我有一个这样的矩阵 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 1

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

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这里有一个函数,它在模式上循环,将
矩阵
转换为
data.frame
,同时
eval
计算表达式,如果计算后没有真值,则返回FALSE,否则检查
未列出的
最小值
索引是否与
排序
索引相同

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

f1注意,如果不满足一个或多个条件,则返回
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)
}

f@mr.T所以如果数据中没有任何列,它也应该返回FALSE,right@mr.T好的,更新了帖子
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