eu tenho alguns dados
set.seed(1)
n <- 100
df <- data.frame(
x = sample(1:30, n, replace = T),
y = sample(1:30, n, replace = T),
z = sample(1:30, n, replace = T)
)
E também tenho uma lista de funções, o número de funções pode ser qualquer, a complexidade das funções também (eu as simplifiquei intencionalmente para este exemplo)
rules <- list(function(i) df$x[i]==26,
function(i) df$y[i]==17,
function(i) df$z[i]==14)
A seguir, tenho uma função que busca sequencialmente o acionamento da primeira função, depois da segunda e assim por diante
# search sequence
# first x[i]==26 then y[i]==17 then z[i]==14
find_rules <- function(df, rules){
ln <- length(rules)
n <- 1
res <- matrix(0,nrow = ln, ncol = 2, dimnames = list(NULL, c("row","res")))
for(i in 1:nrow(df)){
if(rules[[n]](i)){
res[n,"row"] <- i
res[n,"res"] <- 1
n <- n+1
}
if(n==ln+1) break
}
return(res)
}
Gostaria de acelerar find_rules
a função tanto quanto possível sem alterar nada no código apresentado acima. Gostaria também de identidade completa nos cálculos da sua solução e find_rules
nos diferentesseeds()
Tentei manter o seu código o máximo possível mas podemos mudar a forma de iterar, ou seja, por
rules
que deve ser mais rápido que sua solução original se o número de regras for menor que o número de
df
linhas .referência
e vemos isso