Rcpp导入列表/来自R的数据框,其中包含大量变量

时间:2019-02-06 21:51:15

标签: r rcpp

我是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列)吗?

任何帮助/建议将不胜感激。

1 个答案:

答案 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>