我展示了我如何看待这个算法的实现,我把它分为两个步骤
第一步序列搜索
第二步检查中断规则
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)
我有一个函数可以检查数据帧中是否存在逻辑序列
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) 我有一个免费大小的向量列表
\nset.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"\nRun Code Online (Sandbox Code Playgroud)\n有哪些方法可以制作像这样的密集矩阵,但效率更高?\n我也想像示例中那样保存列名称
\nlibrary(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) 我创建了一个函数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) 要求很少。
在发布您的答案之前请!!
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)