我有一些数据
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)
)
我还有函数列表,函数的数量可以是任意的,函数的复杂性也可以(在这个例子中我故意让它们变得简单)
rules <- list(function(i) df$x[i]==26,
function(i) df$y[i]==17,
function(i) df$z[i]==14)
接下来,我有一个函数,它顺序搜索第一个函数的触发,然后是第二个函数,依此类推
# 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)
}
我想 find_rules
在不改变上面代码中任何内容的情况下尽可能地加速功能。我还想在您的解决方案的计算中以及find_rules
不同的情况下获得完整的身份seeds()
我试图尽可能保留你的代码,但我们可以改变迭代的方式,即,
rules
如果规则数小于
df
行数,这应该比原始解决方案更快。基准
我们看到