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
可能会成为严重的性能问题。
我正尝试在 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
可能会成为严重的性能问题。