将所有逻辑规则与矩阵匹配并按相同顺序
Match all logic rules with a matrix and in the same order
比如我有这样一个矩阵
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
的向量,以及 returns 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
应该returnTRUE
,但是return却FALSE
f1(pat = pat,dat = dat)
[1] FALSE
这里是一个循环模式的函数,将matrix
转换为data.frame
,而eval
对表达式进行运算,if
之后没有TRUE值评估 return 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
请注意,如果不满足一个或多个条件
,这将 return 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
比如我有这样一个矩阵
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
的向量,以及 returns 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
应该returnTRUE
,但是return却FALSE
f1(pat = pat,dat = dat)
[1] FALSE
这里是一个循环模式的函数,将matrix
转换为data.frame
,而eval
对表达式进行运算,if
之后没有TRUE值评估 return 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
请注意,如果不满足一个或多个条件
,这将 returnFALSE
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