Rcpp 从具有大量变量的 R 导入列表/数据框
Rcpp import list / dataframe from R with a large number of variable
我是 Rcpp 编程的新手,我无法弄清楚一个非常基本的东西。
我正在尝试将一个大列表从 R 导入到 C++。我正在使用 Rcpp。我的列表包含大约 400,000 行和 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))
这是一个数据框对象。我从这个 post (how many vectors can be added in DataFrame::create( vec1, vec2 ... )?) that you can only import dataframe objects in Rcpp with 20 columns. You could also have as many columns as you want from Kevin Ushey's post here (how many vectors can be added in DataFrame::create( vec1, vec2 ... )?) 知道。我宁愿不使用数据帧路由,因为我需要编写一个相当复杂的函数。
我的困惑来自于:当我使用
typeof(df1)
R 告诉我这是一个列表对象。
在 Rcpp 中导入此数据的最佳方式是什么?有人可以指出我的来源/向我展示我可以用于我的数据集的副本代码吗(请注意我的数据集有 50 列)?
任何 help/advice 将不胜感激。
正如@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>
我是 Rcpp 编程的新手,我无法弄清楚一个非常基本的东西。
我正在尝试将一个大列表从 R 导入到 C++。我正在使用 Rcpp。我的列表包含大约 400,000 行和 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))
这是一个数据框对象。我从这个 post (how many vectors can be added in DataFrame::create( vec1, vec2 ... )?) that you can only import dataframe objects in Rcpp with 20 columns. You could also have as many columns as you want from Kevin Ushey's post here (how many vectors can be added in DataFrame::create( vec1, vec2 ... )?) 知道。我宁愿不使用数据帧路由,因为我需要编写一个相当复杂的函数。
我的困惑来自于:当我使用
typeof(df1)
R 告诉我这是一个列表对象。
在 Rcpp 中导入此数据的最佳方式是什么?有人可以指出我的来源/向我展示我可以用于我的数据集的副本代码吗(请注意我的数据集有 50 列)?
任何 help/advice 将不胜感激。
正如@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>