如何解决将所有逻辑规则与矩阵以相同的顺序匹配
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
的向量,并返回真/假。
如果有人愿意帮助我,我会很高兴
解决方法
这是一个循环模式的函数,将 matrix
转换为 data.frame
,同时 eval
使用表达式,if
评估返回后没有 TRUE 值FALSE 否则检查 unlist
min
索引是否与 sort
ed 索引相同
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
,
请注意,如果不满足一个或多个条件,这将返回 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,which.max)),F)
}
输出
pat <- c("x1>1 & x2>12","x1<x3 & x3>28")
f(dat,pat)
[1] TRUE
pat <- c("x1<1 & x2>12","x1<x3 & x3>28") # first condition not met
f(dat,pat)
[1] FALSE
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。