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

标签 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 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"

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

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

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

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 enter image description here

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

最佳答案

这是一个循环模式的函数,将matrix转换为data.frame,同时eval评估表达式,if 评估后没有 TRUE 值返回 FALSE,否则检查 unlist min 索引是否与 sort 相同编辑一个

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

关于r - 将所有逻辑规则与矩阵并按相同顺序匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66481726/

相关文章:

r - 基于多个字符串的部分匹配的 R 数据帧中的子集行

r - 如何将所有列数据类型动态转换为数字和字符?

r - 以最小距离连接矩阵的两个坐标

time-series - 为什么要采用 HuggingFace 的第一个隐藏状态进行序列分类(DistilBertForSequenceClassification)

python - 如何在 Python 中实现一个行为类似于序列的最小类?

r - 选择第一个正面事件

r - R中的data.frame对象到xts对象的转换

java - 如何打印螺旋顺序矩阵的第二层/连续层

python - 3D 矩阵的 Numpy 排列

matlab - 删除重复项 - ** 仅当重复项按顺序出现时