SortIndex
Description
Returns a permutation of the index elements re-arranged to indicate the ascending sorted ordering of array elements. In the event of a tie, the original order is preserved.
SortIndex(D)
If I is not specified, you should guarantee that D will always be a one-dimensional array. In this case, sortIndex returns an unindexed list of elements.
SortIndex(D,I)
If I is specified, D may be multi-dimensional. Each slice of D is sorted separately along I, with the result being an array having the same dimensionality of D, but where each element is the corresponding element in I indicating the sort.
Examples
To sort the elemets of an index (in ascending order):
SortIndex( I )
To sort the elements of an array, A, along I:
A[I=sortIndex(A,I)]
To sort an array A (indexed by indexes Row and Col) according to the values in Col='key', use:
A[Row=SortIndex( A[Col='key'],Row)]
Advanced Options
Text Sensitivity
When sorting text values, values are compared by default in a text-sensitive fashion, with capital letters coming before lower case letters. For example, "Zebra" comes before "apple" in a case-sensitive order.
In Analytica 4.2 and later, you can control case-sensitivity using:
SortIndex(D,caseInsensitive:true)
In Analytica 4.1 and earlier, use:
SortIndex(TextUpperCase(D))
Descending Order
The descending sort order for an array containing all numeric values is obtained as:
SortIndex(-D)
If an array contains text values, you can obtain the descending order in Analytica 4.2 or later using:
SortIndex(D,descending:true)
In Analytica 4.1 or earlier, when text values are present, reverse the elements after the sort using:
Var r := SortIndex(D) Do Slice(r,Size(r)..1)
Multi-Key Sort
A multi-key sort finds the order by sorting on a primary key, but in the event of a tie, breaking the tie using a secondary key. The pattern can continue to tertiary keys, etc. In the general case, each key may have a different ascending/descending order or differ on whether comparisons should be case-sensitive.
Analytica 4.2 and later has support for multi-key sort built into SortIndex, making multi-key sorting easier than in Analytica 4.1 and earlier. The values used for the primary key, and the values used for each fall-back key, must all share a common index, I. To pass these to SortIndex, you must bundle these together along another index, keyIndex, where the first element along keyIndex is your primary key, the second element is your seconary key, etc. After you bundle these together, the first parameter to SortIndex will be a 2-D array indexed by I and keyIndex. For example:
Index K := ['last','first']; SortIndex(Array(K,[lastName,firstName]), Person, K )
In this example, we use lastName as the primary key and firstName as the secondary key. If the optional parameters descending or caseInsensitive are also passed, these may optionally be indexed by keyIndex if the order or case sensitivity varies by key.
Multi-key sorts are possible in Analytica 4.1 and earlier as well, but require a bit more work. Multi-key sorts are accomplished by taking advantage of the fact that the original ordering is preserved in the event of a tie. Thus, you can sort by the secondary key first, and then sort again using the primary key:
Index order1 := SortIndex(firstname,Person); SortIndex(lastName[Person=order1],Person)
By Position
By default, SortIndex returns the elements of the index in the sorted order. In some cases, you may want the positions of the first element, etc., rather than the index elements (see Associative vs. Positional Indexing). In Analytica 4.2 or better, you can obtain the positions using the optional parameter position:true:
SortIndex(D,position:true)
Using positional notation, the original array can be re-ordered using:
D[@I=SortIndex(D,I,position:true)]
The use of positional indexing would be required, for example, if you index might contain duplicate values (note that in general, it is very bad style to have duplicate elements in an index).
Enable comment auto-refresher