我是Rcpp编程的新手,我无法弄清一个非常基本的东西。
我正在尝试将大列表从R导入c ++。我正在使用Rcpp。我的列表包含约40万行和50列。我在这里重新创建较小的版本,以供您参考。
df1 = data.frame(Variable1=c(1,2,3,4,5,6,7,8,9,10,1),Variable2=c(11,12,13,14,15,16,17,18,19,20,11),
Variable3 = c(1,0,0,1,1,0,0,0,1,0,1),
Variable4=c(1,1,1,1,2,2,2,2,2,2,2),
Variable5=c(20,-2,-5,10,30,2,1,.5,50,-1,60))
这是一个数据框对象。我从这篇文章(how many vectors can be added in DataFrame::create( vec1, vec2 ... )?)知道,您只能在20列的Rcpp中导入数据框对象。您还可以根据需要在Kevin Kevin(此处的how many vectors can be added in DataFrame::create( vec1, vec2 ... )?)中创建任意数量的列。我宁愿不使用数据帧路由,因为我需要编写一个相当复杂的函数。
我的困惑来自以下方面:使用
typeof(df1)
R告诉我这是一个列表对象。
在Rcpp中导入此数据的最佳方法是什么?有人可以指出我的来源/给我看我可以用于我的数据集的副本代码(请注意我的数据集有50列)吗?
任何帮助/建议将不胜感激。
答案 0 :(得分:2)
正如@RalfStubner和@duckmayr所述,您可能一直误读了现有的建筑限制。对接受现有数据框对象没有任何限制。
为说明起见,这不是500列data.frame
(为了简单起见,我们假定仅包含数字向量)的示例,在这里我们将第一行的所有元素加起来。
#include <Rcpp.h>
// [[Rcpp::export]]
double extractFromBigDataFrame(Rcpp::DataFrame d, bool verbose=false) {
int n = d.length();
double sum = 0;
for (int i=0; i<n; i++) {
// we are making a simplifying assumption here that each column is numeric
Rcpp::NumericVector x = d[i];
double elem = x[0];
sum += elem;
if (verbose) print(x);
}
return sum;
}
/*** R
m <- matrix(1:1000, 2, 500)
d <- as.data.frame(m)
extractFromBigDataFrame(d)
rowSums(m) # comparison
*/
R> Rcpp::sourceCpp("/tmp/so54563983.cpp")
R> m <- matrix(1:1000, 2, 500)
R> d <- as.data.frame(m)
R> extractFromBigDataFrame(d)
[1] 250000
R> rowSums(m) # comparison
[1] 250000 250500
R>