Rcpp 中的 dplyr:使用 dplyr 在 Rcpp 中进行左连接

dplyr in Rcpp: Do a left join in Rcpp using dplyr

我正尝试在 Rcpp 中使用 dplyr 来执行以下操作:

> df1 = data.frame(vec1 = c(2,2,3,3,4,5,5,5))
> df2 = data.frame(vec1 = c(2,2,2,2,4,5,6,6), vec2 = c("test1", "test2", "test3", "test1", "test2", "test2", "test1", "test4"))
> df3 <- dplyr::left_join(df1, df2, by = "vec1")
> df3
   vec1  vec2
1     2 test1
2     2 test2
3     2 test3
4     2 test1
5     2 test1
6     2 test2
7     2 test3
8     2 test1
9     3  <NA>
10    3  <NA>
11    4 test2
12    5 test2
13    5 test2
14    5 test2 

这是我目前所知道的,但我不确定如何在 Rcpp 中调用 left_join 函数:

#include <Rcpp.h>
#include <dplyr.h>
// [[Rcpp::depends(dplyr,BH)]]

void test_join(Rcpp::DataFrame df1, Rcpp::DataFrame df2){

  Rcpp::DataFrame df3 = ; // This is what I am missing 

}

我在 github 上阅读了 dplyr 的 src 个文件,我在这个 file 上看到了函数 left_join_impl。这是要使用的功能吗?如果是这样,我不确定如何正确使用它,因为没有文档。

这绝对不是最优雅、最快速的方法,但它可以作为一种简单的解决方法:

library(Rcpp)
sourceCpp(code='
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
DataFrame test_join(DataFrame df1, DataFrame df2, Function left_join) {
return(left_join(df1, df2, "vec1"));
}')

test_join(df1, df2, dplyr::left_join)

与将 dplyr.h 导入您的 C++ 代码相比,它有一个优势:您不必依赖 dplyr 的内部函数,这些函数在未来的版本中可能会发生变化。可能像 left_join 这样的 API 函数将向下兼容,因此这段代码很可能与 dplyr 的未来版本一起工作。

但是由于这会导致多次包装和展开,因此如果多次调用 test_join 可能会成为严重的性能问题。