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

时间:2016-09-01 01:37:58

标签: r dplyr rcpp

我正在尝试在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。这是要使用的功能吗?如果是这样,我不确定如何正确使用它,因为没有文档。

1 个答案:

答案 0 :(得分:1)

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

join

与将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) 导入C ++代码相比,它有一个优势:您不必依赖于dplyr的内部功能,这可能会在将来的版本中发生变化。可能像dplyr.h这样的API函数将向下兼容,因此这段代码很可能适用于未来版本的dplyr。

但是,如果多次调用left_join,这会导致许多包装和解包,这可能是一个严重的性能问题。