r - 在数据框中找到一系列规则,并带有中断规则

标签 r dataframe sequence rules

我展示了我如何看待这个算法的实现,我把它分为两个步骤
第一步序列搜索
enter image description here
第二步检查休息规则
enter image description here

set.seed(123)
dat <- as.data.frame(matrix(sample(10,60,replace = T),ncol = 3))
colnames(dat) <- LETTERS[1:ncol(dat)]
dat

rule <- c("A==0","A==10 & B==4","C==9","A>10","B<0","C==0","A==5","A>10",
          "B<0","C==0","A==9 & B==9","A>10","B<0","A==10","A==7 & B==5")
action <- c("break","next","next",rep("break",3),"next",rep("break",3),
            "next",rep("break",3) ,"next")

rule <- cbind(rule,action)
enter image description here

最佳答案

我认为这有效-

seq_rule <- function(dat, rule, res.only = TRUE) {
  value = rule$action
  rule <- rule$rule
  m <- with(dat, lapply(rule, function(r) eval(str2expression(r))))  
  fu <- function(x, y) {
    k <- which(y)
    ifelse(all(k <= x), NA, min(k[k > x]))
  }  
  idx <- Reduce(fu , m,init = 0, accumulate = TRUE)[-1]  
  if (!res.only) {
    idx <- na.omit(idx)
    fidx <- head(idx, length(rule))
    debug.vec <- replace(rep("no", nrow(dat)), fidx, rule[seq_along(fidx)])
    return(cbind(dat, debug.vec))
  }
  if(any(value[!is.na(idx)] == 'break')) return(FALSE)
  idx <- na.omit(idx)
  length(idx) >= length(rule)
}
这里有一些检查——
rule <- data.frame(rule= c("A==9","B==4","C==4","A==4", "B==10","C==4") ,
                   action= c(rep("next",3),"break","break","next"))

seq_rule(dat = dat,rule = rule)
#[1] FALSE


rule <- data.frame(rule= c("C==9","B==3","C==4"),
                   action= c(rep("next",3)))
seq_rule(dat = dat,rule = rule)
#[1] TRUE

seq_rule(dat = dat,rule = rule, res.only = FALSE)
#    A  B  C debug.vec
#1   3  5  9      C==9
#2   3  3  3      B==3
#3  10  9  4      C==4
#4   2  9  1        no
#5   6  9  7        no
#6   5  3  5        no
#7   4  8 10        no
#8   6 10  7        no
#9   9  7  9        no
#10 10 10  9        no

rule <- data.frame(rule= c("C==9","B==3","C==4", "A == 1"),
                   action= c(rep("next",3), 'break'))
seq_rule(dat = dat,rule = rule)
#[1] FALSE

rule <- data.frame(rule= c("C==9","B==3","C==4", "A == 6"),
                   action= c(rep("next",3), 'break'))
seq_rule(dat = dat,rule = rule)
#[1] FALSE

关于r - 在数据框中找到一系列规则,并带有中断规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68867191/

相关文章:

r - 参数在Dockerfile中的CMD中被忽略

python - pandas 数据库合并多列未正确合并

F#使用GetEnumerator时无法枚举yield生成的序列

python - 如何替换 Pandas DataFRame 中的列和行索引

r - 编辑 R 列中的每一行

jquery 遍历元素列表,按顺序添加和删除类

f# - 在 F# 中从具有 N 个不同索引的序列中取出 N 个元素

r - 用于插入 roxygen #' 注释开始的键盘快捷键

r - 如何使用 plyr mdply 并行故障安全执行

r - 第一次执行代码时颜色不正确