25","x128") pat [1] "x1>1 & x2>12" "x3>25" "x128" 我需要检-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:00:51 25 4
gpt4 key购买 nike

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

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 ,并返回真/假。
如果有人愿意帮助我解决这个问题,我会很高兴
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

最佳答案

这是一个循环模式的函数,转换 matrixdata.frame , 而 eval使用表达式,if评估返回 FALSE 后没有 TRUE 值,否则检查 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com