Rcpp 按dim名称对NumericMatrix的元素排序
我有一个数字矩阵m。假设m为(方括号中的元素为dim名称) 798Rcpp 按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中,有没有一种简单的方法可以对通用数字矩阵执行此操作?这不一定是最简单的方法,但它似乎可以工作
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名称作为键,容器为我们进行排序