gpt4 book ai didi

c++ - 将 NumericMatrix 与 Rcpp 连接起来

转载 作者:太空宇宙 更新时间:2023-11-04 13:03:15 24 4
gpt4 key购买 nike

我想使用 Rcpp 折叠转置 NumericMatrix 的行。例如:

library("data.table")   
library("Rcpp")

dt1 <- data.table(V1=c(1, 0, 2),
V2=c(1, 1, 0),
V3=c(1, 0, 1),
V4=c(0, 1, 2),
V5=c(1, 1, 1))

cppFunction('NumericMatrix transpose(DataFrame data) {
NumericMatrix genotypes = internal::convert_using_rfunction(data, "as.matrix");
NumericMatrix tgeno(data.ncol(), data.nrow());
int number_samples = data.ncol();
int number_snps = data.nrow();
for (int i = 0; i < number_snps; i++) {
for (int j = 0; j < number_samples; j++) {
tgeno(j,i) = genotypes(i,j);
}
}
return tgeno;
}')

dt1
transpose(dt1)

原始矩阵

   V1 V2 V3 V4 V5    
1: 1 1 1 0 1
2: 0 1 0 1 1
3: 2 0 1 2 1

转置矩阵

      [,1] [,2] [,3]    
[1,] 1 0 2
[2,] 1 1 0
[3,] 1 0 1
[4,] 0 1 2
[5,] 1 1 1

我想要以下矩阵:

      [,1]    
[1,] 102
[2,] 110
[3,] 101
[4,] 012
[5,] 111

有人可以建议一种方法吗?

最佳答案

也许作为起点,假设您连接的数字仅由一个数字组成:

//' @export
// [[Rcpp::export]]
std::vector<std::string> string_collapse(const Rcpp::DataFrame& data)
{
R_xlen_t nrow = data.nrow();
R_xlen_t ncol = data.ncol();
std::vector<std::string> ret(ncol);
for (R_xlen_t j = 0; j < ncol; ++j) {
const auto& col = Rcpp::as<Rcpp::NumericVector>(data[j]);
std::string ccstr;
ccstr.reserve(nrow);
for (const auto& chr: col) {
ccstr += std::to_string(chr)[0];
}
ret[j] = ccstr;
}
return ret;
}

它给了

dat <- data.frame(V1=c(1, 0, 2),
V2=c(1, 1, 0),
V3=c(1, 0, 1),
V4=c(0, 1, 2),
V5=c(1, 1, 1))


string_collapse(dat)
[1] "102" "110" "101" "012" "111"

但将其与纯 R 解决方案进行比较的快速基准表明您不应期待奇迹。大概还有优化的空间。

关于c++ - 将 NumericMatrix 与 Rcpp 连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43382047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com