例如,我有一个这样的矩阵
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
的向量,并返回 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
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/