小编mr.*_*r.T的帖子

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

我展示了我如何看待这个算法的实现,我把它分为两个步骤

第一步序列搜索

在此处输入图片说明

第二步检查中断规则

在此处输入图片说明

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

r rules sequence dataframe

8
推荐指数
1
解决办法
292
查看次数

将所有逻辑规则与数据帧匹配(需要超快功能)

我有一个函数可以检查数据帧中是否存在逻辑序列

fu <- function(dat , rule , res.only=T){
debug.vec <- rep("no",nrow(dat)) # control of rule triggers
rule.id <- 1 # rule number in vector
for(i in 1:nrow(dat)){
  # check if the rule "rule[rule.id]" has worked on this "i" index in dat[i,]
  current_rule <- with(data = dat[i,] , expr = eval(parse(text = rule[rule.id]))  )
   if(current_rule){  # if the rule is triggered
          debug.vec[i] <- rule[rule.id]
          if(  rule.id==length(rule)  ) break   # stop if there are no more rules
           rule.id <- rule.id+1  # go …
Run Code Online (Sandbox Code Playgroud)

r rules function

5
推荐指数
1
解决办法
286
查看次数

有效地将向量列表转换为矩阵

我有一个免费大小的向量列表

\n
set.seed(1)\ndat <- lapply(1:10, \\(x) sample(letters, size = sample(1:10,1), replace = T))\n\ndat\n\n[[1]]\n[1] "d" "g" "a" "b" "w" "k" "n" "r" "s"\n\n[[2]]\n[1] "u"\n\n[[3]]\n[1] "j" "v" "n" "j" "g"\n\n[[4]]\n[1] "o" "u" "e" "i" "y" "n" "e" "e" "b"\n\n[[5]]\n [1] "y" "l" "o" "a" "t" "c" "f" "j" "j" "f"\n
Run Code Online (Sandbox Code Playgroud)\n

有哪些方法可以制作像这样的密集矩阵,但效率更高?\n我也想像示例中那样保存列名称

\n
library(arules)\nas(transactions(dat), "matrix")\n\n\n          a     b     c     d     e     f     g     h     i     j     k     l     m\n [1,]  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE\n …
Run Code Online (Sandbox Code Playgroud)

r

5
推荐指数
2
解决办法
140
查看次数

以相同的顺序将模式的所有元素与向量匹配

我创建了一个函数yes.seq,它接受两个参数,一个 patternpat和 data dat。该函数查找数据中是否存在相同序列的模式

例如

dat <- letters[1:10]
dat
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
pat <- c('a',"c","g")
 
yes.seq(pat = pat,dat = dat)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

因为这个序列在模式中并且以相同的顺序

"a"“b” "c"“d”“e”“f” "g"“h”“i”“j”

例如,如果 'dat' 被反转,那么我们得到FALSE

yes.seq(pat = pat, dat = rev(dat))
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)

这是我的功能

yes.seq <- function(pat , dat){  
  lv <- rep(F,length(pat))
  k <- 1     
  for(i in 1:length(dat)){        
            if(dat[i] == pat[k]) 
              {
              lv[k] <- …
Run Code Online (Sandbox Code Playgroud)

r sequence

4
推荐指数
2
解决办法
62
查看次数

尽可能高效地查找矩阵中的序列

要求很少。

在发布您的答案之前请!!

1)确保您的函数不会因其他数据而出错,模拟几个类似的矩阵。(关闭种子)

2)确保你的函数比我的更快

3)确保你的函数与我的函数完全相同,在不同的矩阵上模拟它(关闭种子)

例如

 for(i in 1:500){
    m <- matrix(sample(c(F,T),30,T),ncol = 3) ; colnames(m) <- paste0("x",1:ncol(m))
    
    res <- c(my_fun(m),your_function(m))
    print(res)
    if(sum(res)==1)  break
    }
    m
Run Code Online (Sandbox Code Playgroud)

4)该函数应适用于具有任意行数和列数的矩阵

=================================================== ======== 该函数在逻辑矩阵的第一列中查找 a true,如果找到 true,则转到第 2 列和新行,依此类推。如果找到序列,如果没有找到则返回truefalse

set.seed(15)
m <- matrix(sample(c(F,T),30,T),ncol = 3) ; colnames(m) <- paste0("x",1:ncol(m))
m
         x1    x2    x3
 [1,] FALSE  TRUE  TRUE
 [2,] FALSE FALSE FALSE
 [3,]  TRUE  TRUE  TRUE
 [4,]  TRUE  TRUE  TRUE
 [5,] FALSE FALSE FALSE
 [6,]  TRUE …
Run Code Online (Sandbox Code Playgroud)

performance r matrix sequence

3
推荐指数
3
解决办法
764
查看次数

标签 统计

r ×5

sequence ×3

rules ×2

dataframe ×1

function ×1

matrix ×1

performance ×1