我正在尝试在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
。这是要使用的功能吗?如果是这样,我不确定如何正确使用它,因为没有文档。
答案 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
,这会导致许多包装和解包,这可能是一个严重的性能问题。