繁体   English   中英

检查 dataframe Rcpp (C++) 中的 boolean 表达式

[英]check boolean expression in dataframe Rcpp (C++)

我有一个带有数据的 dataframe dat和一个带有逻辑规则的矢量rule

set.seed(124)
ro <- round(runif(n = 30,1,10),2)
dat <- as.data.frame(matrix(data =ro,ncol = 3)) ; colnames(dat) <- paste0("x" ,1:ncol(dat))
rule <- c("x1 > 5 & x2/2 > 2"  ,  "x1 > x2*2"  ,  "x3!=4")

我需要检查表达式是否为真

id <- 2
 for(i in 1:nrow(dat)){
   cr <- with(data = dat[i,] , expr = eval(parse(text = rule[id])))
   print(cr)
 }
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] TRUE
[1] FALSE
[1] FALSE
[1] FALSE
[1] TRUE

如何使用Rcpp做到这一点?

这里值得强调的两件事是

  • 您不需要所有行都低,因为 R 是矢量化的,而且已经很快了

  • 您可以扫描数据的规则并返回结果矩阵

这两个都是单行的:

> res <- do.call(cbind, lapply(rule, \(r) with(dat, eval(parse(text=r)))))
> res
       [,1]  [,2] [,3]
 [1,] FALSE FALSE TRUE
 [2,] FALSE FALSE TRUE
 [3,]  TRUE FALSE TRUE
 [4,] FALSE FALSE TRUE
 [5,] FALSE FALSE TRUE
 [6,] FALSE  TRUE TRUE
 [7,]  TRUE FALSE TRUE
 [8,]  TRUE FALSE TRUE
 [9,]  TRUE FALSE TRUE
[10,] FALSE  TRUE TRUE
> 

(我在那里使用了 R 4.1.* anonymous function,您也可以将\(r)替换为标准function(r) 。)

因为这已经是矢量化的,所以它会比你的每行调用更快,即使你用 Rcpp 这样做也不会比已经矢量化的代码快(很多)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM