【发布时间】:2018-11-17 02:32:19
【问题描述】:
我正在尝试使用 foreach 包将函数应用于 r 中的多个组/ID。通过%dopar% 使用并行处理运行需要很长时间,所以我想知道是否可以通过rcpp 或其他包运行apply 或c++ 中的for 循环部分以使其更快。我不熟悉c++ 或其他可以做到这一点的软件包,所以我希望了解这是否可能。示例代码如下。我的实际功能更长,有超过 20 个输入,运行时间比我发布的还要长
感谢您的帮助。
编辑:
我意识到我最初的问题很模糊,所以我会努力做得更好。我有一个按组包含时间序列数据的表。每个组有 > 10K 行。我通过rcpp 在c++ 中编写了一个函数,该函数按组过滤表并应用一个函数。我想遍历独特的组并结合rbind 使用rcpp 的结果,以便它运行得更快。见下面的示例代码(我的实际功能更长)
library(data.table)
library(inline)
library(Rcpp)
library(stringi)
library(Runuran)
# Fake data
DT <- data.table(Group = rep(do.call(paste0, Map(stri_rand_strings, n=10, length=c(5, 4, 1),
pattern = c('[A-Z]', '[0-9]', '[A-Z]'))), 180))
df <- DT[order(Group)][
, .(Month = seq(1, 180, 1),
Col1 = urnorm(180, mean = 500, sd = 1, lb = 5, ub = 1000),
Col2 = urnorm(180, mean = 1000, sd = 1, lb = 5, ub = 1000),
Col3 = urnorm(180, mean = 300, sd = 1, lb = 5, ub = 1000)),
by = Group
]
# Rcpp function
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
DataFrame testFunc(DataFrame df, StringVector ids, double var1, double var2) {
// Filter by group
using namespace std;
StringVector sub = df["Group"];
std::string level = Rcpp::as<std::string>(ids[0]);
Rcpp::LogicalVector ind(sub.size());
for (int i = 0; i < sub.size(); i++){
ind[i] = (sub[i] == level);
}
// Access the columns
CharacterVector Group = df["Group"];
DoubleVector Month = df["Month"];
DoubleVector Col1 = df["Col1"];
DoubleVector Col2 = df["Col2"];
DoubleVector Col3 = df["Col3"];
// Create calculations
DoubleVector Cola = Col1 * (var1 * var2);
DoubleVector Colb = Col2 * (var1 * var2);
DoubleVector Colc = Col3 * (var1 * var2);
DoubleVector Cold = (Cola + Colb + Colc);
// Result summary
std::string Group_ID = level;
double SumCol1 = sum(Col1);
double SumCol2 = sum(Col2);
double SumCol3 = sum(Col3);
double SumColAll = sum(Cold);
// return a new data frame
return DataFrame::create(_["Group_ID"]= Group_ID, _["SumCol1"]= SumCol1,
_["SumCol2"]= SumCol2, _["SumCol3"]= SumCol3, _["SumColAll"]= SumColAll);
}
# Test function
Rcpp::sourceCpp('sample.cpp')
testFunc(df, ids = "BFTHU1315C", var1 = 24, var2 = 76) # ideally I would like to loop through all groups (unique(df$Group))
# Group_ID SumCol1 SumCol2 SumCol3 SumColAll
# 1 BFTHU1315C 899994.6 1798561 540001.6 5907129174
提前致谢。
【问题讨论】:
-
你写“我不熟悉c++”,这很好。只是不要指望这里有一个随机的陌生人为您编写代码。这就是 StackOverflow 的工作原理,请参阅此处的 the tour 了解更多信息。
-
感谢@DirkEddelbuettel 的回复。我已经使用有效的
c++代码编辑了我的问题
标签: r for-loop foreach rcpp rcppparallel