Rcppでの名前付き数値ベクトルの並べ替え


8

関数で、数値を計算して名前を付け、ソートされた値を返したい NumericVector、Rcppでてます。(これを使用し)ベクトルをソートできますが、値の名前の順序は同じです。

library(Rcpp)
x <- c(a = 1, b = 5, c = 3)
cppFunction('
NumericVector foo(NumericVector x) {
  std::sort(x.begin(), x.end());
  return(x);
}')
foo(x)
## a b c 
## 1 3 5 

私は関数がこれを返すことを望みます:

## a c b 
## 1 3 5 

出来ますか?どうすればこれを達成できますか?


4
承知しました。最初の近似として、ソート順を決定し、それを使用して名前属性のインデックスを再作成する必要があります。
Dirk Eddelbuettel

回答:


5

Dirkがコメントで述べたヒントを使用して、私xはの名前が単なる別のベクトルであることを理解しました。そこで、別のベクターを使用してベクターの並べ替えを検索しました。このSOの答えを使用して、次の2つの解決策を考え出します。

library(Rcpp)
x = c(a = 1, b = 5, c = 3, d = -3.2)

cppFunction('
NumericVector foo1(NumericVector x) {
 IntegerVector idx = seq_along(x) - 1;
 std::sort(idx.begin(), idx.end(), [&](int i, int j){return x[i] < x[j];});
 return x[idx];
}')

foo1(x)

##    d    a    c    b 
## -3.2  1.0  3.0  5.0 


cppFunction('
NumericVector foo2(NumericVector x) {
 IntegerVector idx = seq_along(x) - 1;
 //// Ordered indices based on x:
 std::sort(idx.begin(), idx.end(), [&](int i, int j){return x[i] < x[j];});
 //// Get the names of x:
 CharacterVector names_of_x = x.names();
 //// y vector is sorted x 
 NumericVector y = x[idx];
 //// Assign sorted names to y vector as names
 y.attr("names") = names_of_x[idx];
 return y;
}')

foo2(x)

##    d    a    c    b 
## -3.2  1.0  3.0  5.0 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.