Rcpp 按dim名称对NumericMatrix的元素排序

Rcpp 按dim名称对NumericMatrix的元素排序,rcpp,Rcpp,我有一个数字矩阵m。假设m为(方括号中的元素为dim名称) 798 4.65 1 3 2 列名={x”,“z”,“y”},行名={“z”,“y”,“x”} 我想要以下输出 1 2 3 4.56 7 8 9 列名={“x”、“y”、“z”},行名={“x”、“y”、“z”} 所以我想做的是- 根据列名对每行的元素进行排序 排列行,以便对其对应的行名称进行排序 在Rcpp中,有没有一种简单的方法可以对通用数字矩阵执行此操作?这不一定是最简单的方法,但它似乎可以工作

我有一个数字矩阵m。假设m为(方括号中的元素为dim名称)

798
4.65
1 3 2 列名={x”,“z”,“y”},行名={“z”,“y”,“x”}

我想要以下输出
1 2 3
4.56
7 8 9 列名={“x”、“y”、“z”},行名={“x”、“y”、“z”}

所以我想做的是-

  • 根据列名对每行的元素进行排序
  • 排列行,以便对其对应的行名称进行排序

  • 在Rcpp中,有没有一种简单的方法可以对通用数字矩阵执行此操作?

    这不一定是最简单的方法,但它似乎可以工作:

    #include <Rcpp.h>
    #include <map>
    // [[Rcpp::plugins(cpp11)]]
    
    // [[Rcpp::export]]
    Rcpp::NumericMatrix dim_sort(const Rcpp::NumericMatrix& m) {
    
      Rcpp::Function rownames("rownames");
      Rcpp::Function colnames("colnames");
      Rcpp::CharacterVector rn = rownames(m);
      Rcpp::CharacterVector cn = colnames(m);
    
      Rcpp::NumericMatrix result(Rcpp::clone(m));
      Rcpp::CharacterVector srn(Rcpp::clone(rn));
      Rcpp::CharacterVector scn(Rcpp::clone(cn));
    
      std::map<std::string, int> row_map;
      std::map<std::string, int> col_map;
    
      for (int i = 0; i < rn.size(); i++) {
        row_map.insert(std::pair<std::string, int>(Rcpp::as<std::string>(rn[i]), i));
        col_map.insert(std::pair<std::string, int>(Rcpp::as<std::string>(cn[i]), i));
      }
    
      typedef std::map<std::string, int>::const_iterator cit;
      cit cm_it = col_map.begin();
      int J = 0;
      for (; cm_it != col_map.end(); ++cm_it) {
        int I = 0;
        int j = cm_it->second;
        scn[J] = cm_it->first;
        cit rm_it = row_map.begin();
        for (; rm_it != row_map.end(); ++rm_it) {
          int i = rm_it->second;
          result(J, I) = m(j, i);
          srn[I] = rm_it->first;
          I++;
        }
        J++;
      }
    
      result.attr("dimnames") = Rcpp::List::create(srn, scn);
      return result;
    }
    
    /*** R
    
    x <- matrix(
      c(7,9,8,4,6,5,1,3,2),
      nrow = 3,
      dimnames = list(
        c("x", "z", "y"),
        c("z", "y", "x")
      ),
      byrow = TRUE
    )
    
    R> x
      z y x
    x 7 9 8
    z 4 6 5
    y 1 3 2
    
    R> dim_sort(x)
      x y z
    x 1 2 3
    y 4 5 6
    z 7 8 9
    
    */
    
    #包括
    #包括
    //[[Rcpp::插件(cpp11)]]
    //[[Rcpp::导出]]
    Rcpp::NumericMatrix dim_排序(常量Rcpp::NumericMatrix&m){
    Rcpp::函数行名(“行名”);
    Rcpp::函数colnames(“colnames”);
    Rcpp::CharacterVector rn=行名(m);
    Rcpp::CharacterVector cn=colnames(m);
    Rcpp::numerimatrix结果(Rcpp::clone(m));
    Rcpp::charactervectorsrn(Rcpp::clone(rn));
    Rcpp::charactervectorscn(Rcpp::clone(cn));
    标准::地图行\地图;
    std::map col_map;
    对于(int i=0;i秒;
    scn[J]=cm_it->first;
    cit rm_it=row_map.begin();
    for(;rm_it!=行映射.end();++rm_it){
    int i=rm_it->second;
    结果(J,I)=m(J,I);
    srn[I]=rm_it->first;
    I++;
    }
    J++;
    }
    result.attr(“dimnames”)=Rcpp::List::create(srn,scn);
    返回结果;
    }
    /***R
    x x
    zyx
    x798
    Z465
    y 1 3 2
    R> 尺寸排序(x)
    x y z
    x123
    y 4 5 6
    z 7 8 9
    */
    
    我使用std::map有两个原因:

  • map
    s根据其键自动维护排序顺序,因此通过使用dim名称作为键,容器为我们进行排序
  • 让一个键的对应值是一个整数,表示它的添加顺序,我们有一个索引,用于沿着给定维度检索适当的值