逐行迭代导入数据帧中的向量 我尝试把从R转换到C++编码。如果你选择否决这个问题,至少要给我一个答案,这样我才能学到一些东西。我的问题是,如果我通过C++数据文件,我应该如何在C++中进行行计算?从概念上讲,我理解,一旦我通过C++数据文件,C++将把每个列当作自己的向量,我必须明确地命名。我遇到的问题是设置一个for循环,一次遍历所有向量的相同位置,从而在功能上模拟R中的行函数。我还想将此问题扩展到以下应用程序: 如何设置一个循环,循环遍历一行并返回一个向量。像R中的rowsum?在使用矩阵的高级R中有这样一个例子,但命名法不会从数据帧转换为一堆向量 如何设置一个循环,循环遍历一行并更改每行中的值,然后返回修改过的向量
如何设置一个循环,一次遍历一系列行,从而生成一个滑动窗口函数?像这样:逐行迭代导入数据帧中的向量 我尝试把从R转换到C++编码。如果你选择否决这个问题,至少要给我一个答案,这样我才能学到一些东西。我的问题是,如果我通过C++数据文件,我应该如何在C++中进行行计算?从概念上讲,我理解,一旦我通过C++数据文件,C++将把每个列当作自己的向量,我必须明确地命名。我遇到的问题是设置一个for循环,一次遍历所有向量的相同位置,从而在功能上模拟R中的行函数。我还想将此问题扩展到以下应用程序: 如何设置一个循环,循环遍历一行并返回一个向量。像R中的rowsum?在使用矩阵的高级R中有这样一个例子,但命名法不会从数据帧转换为一堆向量 如何设置一个循环,循环遍历一行并更改每行中的值,然后返回修改过的向量,r,rcpp,R,Rcpp,如何设置一个循环,一次遍历一系列行,从而生成一个滑动窗口函数?像这样: ## an example of a for loop in R that I want to recapitulate in c++ output <- list() for(i in 1:nrow(df)){ end_row <- i+3 df_tmp <- df[i:end_row, ] ## do some function here output[[i]] <- list
## an example of a for loop in R that I want to recapitulate in c++
output <- list()
for(i in 1:nrow(df)){
end_row <- i+3
df_tmp <- df[i:end_row, ]
## do some function here
output[[i]] <- list(df_tmp)
}
代码> > A,我想在C++中对R中的for循环的一个例子
输出我不相信你会从C++中获得性能。但是,如果您有一组长度相等的向量(
data.frame
保证),那么您只需使用一个索引进行迭代:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame modifyDataFrame(DataFrame df) {
// access the columns
IntegerVector a = df["a"];
IntegerVector b = df["b"];
CharacterVector c = df["c"];
NumericVector d = df["d"];
CharacterVector e = df["e"];
for(int i=0; i < df.nrow(); ++i){
a(i) += 1;
b(i) += 2;
c(i) += "c";
d(i) += 3;
e(i) += "e";
}
// return a new data frame
return DataFrame::create(_["a"]= a, _["b"]= b, _["c"]= c, _["d"]= d, _["e"]=e);
}
/*** R
a <- c(0, 2, 4, 6, 8, 10)
b <- c(1, 3, 5, 7, 9, 11)
c <- c("chr1", "chr1", "chr1", "chr1", "chr1", "chr1")
d <- c(10.2, 10.2, 4.3, 4.3, 3.4, 7.9)
e <- c("a", "t", "t", "g", "c", "a")
df <- data.frame(a, b, c, d, e)
modifyDataFrame(df)
*/
这里我使用的是DataFrame
类的nrow()
方法,c.f。这使用R的C API,就像length()
方法一样。我只是觉得使用DataFrame方法比选择一个向量来检索长度更符合逻辑。结果是一样的
至于滑动窗口,我将首先查看
RcppRoll
包 我们称之为Rcpp。不是rcpp,也不是rcpp。如果您发现缺少文档,欢迎您提出适当的拉取请求,也欢迎您对文档的贡献。请参阅@G.Grothendieck,我已经看到了这篇文章。它处理子设置,这非常简单。你是在建议我需要子集,然后编写一个函数来执行计算吗?@DirkEddelbuettel为命名错误感到抱歉。我已经搜索了Rcpp画廊,但没有找到我要找的。你介意发个链接吗?我一定没有正确搜索此数据库。我可以使用df.nrow()?!嗯,很简单。这是仅限Rcpp的命令吗?这会以任何方式回传给R吗?我已经读到,调用R会极大地阻碍C++的性能。如果是这样,有没有更好的方法?另外,我如何指定I+4的范围来创建“滑动”窗口式函数?@Phil\T请查看修改后的答案。我需要编写自定义函数。在“滚动窗口”框架内,我将进行大量线性代数、文本解析和类似性质的计算。RcppRoll不允许我这样做,因此我试图绕过它。我用zoo软件包写的东西慢得令人痛苦。你介意给我一个正确的方向吗?这样我就可以开始了?@Phil\T如果你想在子向量上使用Rcpp sugar函数,你只需要提取子向量。否则,可以使用双循环,一个具有输出长度,另一个具有窗口长度。有时,您还可以通过添加一个值和删除另一个值来使用单个循环(例如,滚动求和)。
#include <algorithm>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame modifyDataFrame(DataFrame df) {
// access the columns
IntegerVector a = df["a"];
IntegerVector b = df["b"];
CharacterVector c = df["c"];
IntegerVector d = df["d"];
CharacterVector e = df["e"];
// write the for loop. I'm attempting to define a single
//position and then apply it to all vectors...
//but no versions of this approach have worked.
for(int i=0; i < a.length(); ++i){
// do some function
}
// return a new data frame
return DataFrame::create(_["a"]= a, _["b"]= b, _["c"]= c, _["d"]= d, _["e"]=e);
}
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame modifyDataFrame(DataFrame df) {
// access the columns
IntegerVector a = df["a"];
IntegerVector b = df["b"];
CharacterVector c = df["c"];
NumericVector d = df["d"];
CharacterVector e = df["e"];
for(int i=0; i < df.nrow(); ++i){
a(i) += 1;
b(i) += 2;
c(i) += "c";
d(i) += 3;
e(i) += "e";
}
// return a new data frame
return DataFrame::create(_["a"]= a, _["b"]= b, _["c"]= c, _["d"]= d, _["e"]=e);
}
/*** R
a <- c(0, 2, 4, 6, 8, 10)
b <- c(1, 3, 5, 7, 9, 11)
c <- c("chr1", "chr1", "chr1", "chr1", "chr1", "chr1")
d <- c(10.2, 10.2, 4.3, 4.3, 3.4, 7.9)
e <- c("a", "t", "t", "g", "c", "a")
df <- data.frame(a, b, c, d, e)
modifyDataFrame(df)
*/
> modifyDataFrame(df)
a b c d e
1 1 3 chr1c 13.2 ae
2 3 5 chr1c 13.2 te
3 5 7 chr1c 7.3 te
4 7 9 chr1c 7.3 ge
5 9 11 chr1c 6.4 ce
6 11 13 chr1c 10.9 ae