red_amber 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +56 -22
- data/.yardopts +2 -0
- data/CHANGELOG.md +178 -0
- data/Gemfile +1 -1
- data/LICENSE +1 -1
- data/README.md +29 -30
- data/benchmark/basic.yml +7 -7
- data/benchmark/combine.yml +3 -3
- data/benchmark/dataframe.yml +15 -9
- data/benchmark/group.yml +6 -6
- data/benchmark/reshape.yml +6 -6
- data/benchmark/vector.yml +6 -3
- data/doc/DataFrame.md +32 -12
- data/doc/DataFrame_Comparison.md +65 -0
- data/doc/SubFrames.md +11 -0
- data/doc/Vector.md +207 -1
- data/doc/yard-templates/default/fulldoc/html/css/common.css +6 -0
- data/lib/red_amber/data_frame.rb +454 -85
- data/lib/red_amber/data_frame_combinable.rb +609 -115
- data/lib/red_amber/data_frame_displayable.rb +313 -34
- data/lib/red_amber/data_frame_indexable.rb +122 -19
- data/lib/red_amber/data_frame_loadsave.rb +78 -10
- data/lib/red_amber/data_frame_reshaping.rb +184 -14
- data/lib/red_amber/data_frame_selectable.rb +623 -70
- data/lib/red_amber/data_frame_variable_operation.rb +452 -35
- data/lib/red_amber/group.rb +186 -22
- data/lib/red_amber/helper.rb +74 -14
- data/lib/red_amber/refinements.rb +26 -6
- data/lib/red_amber/subframes.rb +1101 -0
- data/lib/red_amber/vector.rb +362 -11
- data/lib/red_amber/vector_aggregation.rb +312 -0
- data/lib/red_amber/vector_binary_element_wise.rb +506 -0
- data/lib/red_amber/vector_selectable.rb +265 -23
- data/lib/red_amber/vector_unary_element_wise.rb +529 -0
- data/lib/red_amber/vector_updatable.rb +278 -34
- data/lib/red_amber/version.rb +2 -1
- data/lib/red_amber.rb +13 -1
- data/red_amber.gemspec +2 -2
- metadata +13 -8
- data/doc/image/dataframe/reshaping_DataFrames.png +0 -0
- data/lib/red_amber/vector_functions.rb +0 -242
data/doc/DataFrame.md
CHANGED
@@ -57,6 +57,10 @@ Class `RedAmber::DataFrame` represents 2D-data. A `DataFrame` consists with:
|
|
57
57
|
```ruby
|
58
58
|
RedAmber::DataFrame.load("test/entity/with_header.csv")
|
59
59
|
```
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
RedAmber::DataFrame.load("test/entity/without_header.csv", headers: [:x, :y, :z])
|
63
|
+
```
|
60
64
|
|
61
65
|
- from a string buffer
|
62
66
|
|
@@ -275,6 +279,7 @@ penguins.to_rover
|
|
275
279
|
|
276
280
|
- Shows some information about self in a transposed style.
|
277
281
|
- `tdr_str` returns same info as a String.
|
282
|
+
- `glimpse` is an alias. It is similar to dplyr's (or Polars's) `glimpse()`.
|
278
283
|
|
279
284
|
```ruby
|
280
285
|
require 'red_amber'
|
@@ -568,7 +573,7 @@ penguins.to_rover
|
|
568
573
|
[1, 2, 3]
|
569
574
|
```
|
570
575
|
|
571
|
-
### `slice ` -
|
576
|
+
### `slice ` - cut into slices of records -
|
572
577
|
|
573
578
|
Slice and select records (rows) to create a sub DataFrame.
|
574
579
|
|
@@ -601,11 +606,14 @@ penguins.to_rover
|
|
601
606
|
|
602
607
|
- Booleans as an argument
|
603
608
|
|
604
|
-
`slice(booleans)` accepts booleans as an argument in an Array, a Vector or an Arrow::BooleanArray . Booleans must be same length as `size`.
|
609
|
+
`filter(booleans)` or `slice(booleans)` accepts booleans as an argument in an Array, a Vector or an Arrow::BooleanArray . Booleans must be same length as `size`.
|
610
|
+
|
611
|
+
note: `slice(booleans)` is acceptable for orthogonality of `slice`/`remove`.
|
605
612
|
|
606
613
|
```ruby
|
607
614
|
vector = penguins[:bill_length_mm]
|
608
|
-
penguins.
|
615
|
+
penguins.filter(vector >= 40)
|
616
|
+
# penguins.slice(vector >= 40) is also acceptable
|
609
617
|
|
610
618
|
# =>
|
611
619
|
#<RedAmber::DataFrame : 242 x 8 Vectors, 0x0000000000043d3c>
|
@@ -833,14 +841,14 @@ penguins.to_rover
|
|
833
841
|
|
834
842
|
Assign new or updated variables (columns) and create an updated DataFrame.
|
835
843
|
|
836
|
-
- Variables with new keys will append new columns from
|
844
|
+
- Variables with new keys will append new columns from right.
|
837
845
|
- Variables with exisiting keys will update corresponding vectors.
|
838
846
|
|
839
847
|

|
840
848
|
|
841
849
|
- Variables as arguments
|
842
850
|
|
843
|
-
`assign(
|
851
|
+
`assign(key_value_pairs)` accepts pairs of key and values as parameters. `key_value_pairs` should be a Hash of `{key => array_like}` or an Array of Arrays like `[[key, array_like], ... ]`. `array_like` is ether `Vector`, `Array` or `Arrow::Array`.
|
844
852
|
|
845
853
|
```ruby
|
846
854
|
df = RedAmber::DataFrame.new(
|
@@ -857,12 +865,12 @@ penguins.to_rover
|
|
857
865
|
2 Hinata 28
|
858
866
|
|
859
867
|
# update :age and add :brother
|
860
|
-
df.assign
|
868
|
+
df.assign(
|
861
869
|
{
|
862
870
|
age: age + 29,
|
863
871
|
brother: ['Santa', nil, 'Momotaro']
|
864
872
|
}
|
865
|
-
|
873
|
+
)
|
866
874
|
|
867
875
|
# =>
|
868
876
|
#<RedAmber::DataFrame : 3 x 3 Vectors, 0x00000000000658b0>
|
@@ -932,7 +940,7 @@ penguins.to_rover
|
|
932
940
|
|
933
941
|
- Append from left
|
934
942
|
|
935
|
-
`assign_left` method accepts the same parameters and block as `assign`, but append new columns from
|
943
|
+
`assign_left` method accepts the same parameters and block as `assign`, but append new columns from left.
|
936
944
|
|
937
945
|
```ruby
|
938
946
|
df.assign_left(new_index: df.indices(1))
|
@@ -1453,6 +1461,8 @@ When the option `keep_key: true` used, the column `key` will be preserved.
|
|
1453
1461
|
1 B 4
|
1454
1462
|
2 D 5
|
1455
1463
|
```
|
1464
|
+
##### `set_operable?(other)`
|
1465
|
+
Check if `types` of self and other are same.
|
1456
1466
|
|
1457
1467
|
##### `intersect(other)`
|
1458
1468
|
|
@@ -1498,15 +1508,23 @@ When the option `keep_key: true` used, the column `key` will be preserved.
|
|
1498
1508
|
<string> <uint8>
|
1499
1509
|
1 B 2
|
1500
1510
|
2 C 3
|
1511
|
+
|
1512
|
+
other.differencr(df)
|
1513
|
+
#=>
|
1514
|
+
#<RedAmber::DataFrame : 2 x 2 Vectors, 0x0000000000040e0c>
|
1515
|
+
KEY1 KEY2
|
1516
|
+
<string> <uint8>
|
1517
|
+
0 B 4
|
1518
|
+
1 D 5
|
1501
1519
|
```
|
1502
1520
|
|
1503
1521
|
## Binding
|
1504
1522
|
|
1505
1523
|
### `concatenate(other)`
|
1506
1524
|
|
1507
|
-
Concatenate another DataFrame or Table onto the bottom of self. The
|
1525
|
+
Concatenate another DataFrame or Table onto the bottom of self. The types of other must be the same as self.
|
1508
1526
|
|
1509
|
-
The alias is `concat`.
|
1527
|
+
The alias is `concat` and `bind_rows`.
|
1510
1528
|
|
1511
1529
|
An array of DataFrames or Tables is also acceptable as other.
|
1512
1530
|
|
@@ -1538,9 +1556,11 @@ When the option `keep_key: true` used, the column `key` will be preserved.
|
|
1538
1556
|
3 4 D
|
1539
1557
|
```
|
1540
1558
|
|
1541
|
-
### `merge(other)`
|
1559
|
+
### `merge(*other)`
|
1560
|
+
|
1561
|
+
Concatenate another DataFrame or Table onto the bottom of self. The size of other must be the same as self. Self and other must not share the same key.
|
1542
1562
|
|
1543
|
-
|
1563
|
+
The alias is `bind_cols`.
|
1544
1564
|
|
1545
1565
|
```ruby
|
1546
1566
|
df
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Comparison of DataFrames
|
2
|
+
|
3
|
+
Compare basic features of RedAmber with Python
|
4
|
+
[pandas](https://pandas.pydata.org/),
|
5
|
+
R [Tidyverse](https://www.tidyverse.org/) and
|
6
|
+
Julia [Dataframes](https://dataframes.juliadata.org/stable/).
|
7
|
+
|
8
|
+
## Select columns (variables)
|
9
|
+
|
10
|
+
| Features | RedAmber | Tidyverse | pandas | DataFrames.jl |
|
11
|
+
|--- |--- |--- |--- |--- |
|
12
|
+
| Select columns as a dataframe | pick, drop, [] | dplyr::select, dplyr::select_if | [], loc[], iloc[], drop, select_dtypes | [], select |
|
13
|
+
| Select a column as a vector | [], v | dplyr::pull, [, x] | [], loc[], iloc[] | [!, :x] |
|
14
|
+
| Move columns to a new position | pick, [] | relocate | [], reindex, loc[], iloc[] | select,transform |
|
15
|
+
|
16
|
+
## Select rows (records, observations)
|
17
|
+
|
18
|
+
| Features | RedAmber | Tidyverse | pandas | DataFrames.jl |
|
19
|
+
|--- |--- |--- |--- |--- |
|
20
|
+
| Select rows that meet logical criteria as a dataframe | slice, remove, [] | dplyr::filter | [], filter, query, loc[] | filter |
|
21
|
+
| Select rows by position as a dataframe | slice, remove, [] | dplyr::slice | iloc[], drop | subset |
|
22
|
+
| Move rows to a new position | slice, [] | dplyr::filter, dplyr::slice | reindex, loc[], iloc[] | permute |
|
23
|
+
|
24
|
+
## Update columns / create new columns
|
25
|
+
|
26
|
+
|Features | RedAmber | Tidyverse | pandas | DataFrames.jl |
|
27
|
+
|--- |--- |--- |--- |--- |
|
28
|
+
| Update existing columns | assign | dplyr::mutate | assign, []= | mapcols |
|
29
|
+
| Create new columns | assign, assign_left | dplyr::mutate | apply | insertcols,.+ |
|
30
|
+
| Compute new columns, drop others | new | transmute | (dfply:)transmute | transform,insertcols,mapcols |
|
31
|
+
| Rename columns | rename | dplyr::rename, dplyr::rename_with, purrr::set_names | rename, set_axis | rename |
|
32
|
+
| Sort dataframe | sort | dplyr::arrange | sort_values | sort |
|
33
|
+
|
34
|
+
## Reshape dataframe
|
35
|
+
|
36
|
+
| Features | RedAmber | Tidyverse | pandas | DataFrames.jl |
|
37
|
+
|--- |--- |--- |--- |--- |
|
38
|
+
| Gather columns into rows (create a longer dataframe) | to_long | tidyr::pivot_longer | melt | stack |
|
39
|
+
| Spread rows into columns (create a wider dataframe) | to_wide | tidyr::pivot_wider | pivot | unstack |
|
40
|
+
| transpose a wide dataframe | transpose | transpose, t | transpose, T | permutedims |
|
41
|
+
|
42
|
+
## Grouping
|
43
|
+
|
44
|
+
| Features | RedAmber | Tidyverse | pandas | DataFrames.jl |
|
45
|
+
|--- |--- |--- |--- |--- |
|
46
|
+
|Grouping | group, group.summarize | dplyr::group_by %>% dplyr::summarise | groupby.agg | combine,groupby |
|
47
|
+
|
48
|
+
## Combine dataframes or tables
|
49
|
+
|
50
|
+
| Features | RedAmber | Tidyverse | pandas | DataFrames.jl |
|
51
|
+
|--- |--- |--- |--- |--- |
|
52
|
+
| Combine additional columns | merge, bind_cols | dplyr::bind_cols | concat | combine |
|
53
|
+
| Combine additional rows | concatenate, concat, bind_rows | dplyr::bind_rows | concat | transform |
|
54
|
+
| Join right to left, leaving only the matching rows| join, inner_join | dplyr::inner_join | merge | innerjoin |
|
55
|
+
| Join right to left, leaving all rows | join, full_join, outer_join | dplyr::full_join | merge | outerjoin |
|
56
|
+
| Join matching values to left from right | join, left_join | dplyr::left_join | merge | leftjoin |
|
57
|
+
| Join matching values from left to right | join, right_join | dplyr::right_join | merge | rightjoin |
|
58
|
+
| Return rows of left that have a match in right | join, semi_join | dplyr::semi_join | [isin] | semijoin |
|
59
|
+
| Return rows of left that do not have a match in right | join, anti_join | dplyr::anti_join | [isin] | antijoin |
|
60
|
+
| Collect rows that appear in left or right | union | dplyr::union | merge | |
|
61
|
+
| Collect rows that appear in both left and right | intersect | dplyr::intersect | merge | |
|
62
|
+
| Collect rows that appear in left but not right | difference, setdiff | dplyr::setdiff | merge | |
|
63
|
+
|
64
|
+
|
65
|
+
|
data/doc/SubFrames.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# SubFrames
|
2
|
+
|
3
|
+
`SubFrames` represents a collection of subsets of a DataFrame.
|
4
|
+
It has an Array of indices `#subset_indices` which is able to create an Array of sub DataFrames.
|
5
|
+
The concept includes `group` operation of a Dataframe, rolling window operation and has more broad capabilities.
|
6
|
+
|
7
|
+
This feature is experimental. It may be removed or be changed in the future.
|
8
|
+
|
9
|
+
## Create SubFrames
|
10
|
+
|
11
|
+
## Properties of SubFrames
|
data/doc/Vector.md
CHANGED
@@ -182,6 +182,31 @@ boolean.all(skip_nulls: true) #=> true
|
|
182
182
|
boolean.all(skip_nulls: false) #=> false
|
183
183
|
```
|
184
184
|
|
185
|
+
### Check if `function` is an aggregation function: `Vector.aggregate?(function)`
|
186
|
+
|
187
|
+
Return true if `function` is an unary aggregation function. Otherwise return false.
|
188
|
+
|
189
|
+
### Treat aggregation function as an element-wise function: `propagate(function)`
|
190
|
+
|
191
|
+
Spread the return value of an aggregate function as if it is a element-wise function.
|
192
|
+
|
193
|
+
```ruby
|
194
|
+
vec = Vector.new(1, 2, 3, 4)
|
195
|
+
vec.propagate(:mean)
|
196
|
+
# =>
|
197
|
+
#<RedAmber::Vector(:double, size=4):0x000000000001985c>
|
198
|
+
[2.5, 2.5, 2.5, 2.5]
|
199
|
+
```
|
200
|
+
|
201
|
+
`#propagate` also accepts a block to compute with a customized aggregation function yielding a scalar.
|
202
|
+
|
203
|
+
```ruby
|
204
|
+
vec.propagate { |v| v.mean.round }
|
205
|
+
# =>
|
206
|
+
#<RedAmber::Vector(:uint8, size=4):0x000000000000cb98>
|
207
|
+
[3, 3, 3, 3]
|
208
|
+
```
|
209
|
+
|
185
210
|
### Unary element-wise: `vector.func => vector`
|
186
211
|
|
187
212
|

|
@@ -305,7 +330,7 @@ double.round(n_digits: -1)
|
|
305
330
|
|
306
331
|
Returns index of specified element.
|
307
332
|
|
308
|
-
### `quantiles(probs = [
|
333
|
+
### `quantiles(probs = [0.0, 0.25, 0.5, 0.75, 1.0], interpolation: :linear, skip_nils: true, min_count: 0)`
|
309
334
|
|
310
335
|
Returns quantiles for specified probabilities in a DataFrame.
|
311
336
|
|
@@ -601,3 +626,184 @@ vector.merge(other, sep: '')
|
|
601
626
|
#<RedAmber::Vector(:string, size=3):0x0000000000038b80>
|
602
627
|
["ab", "cd", "ef"]
|
603
628
|
```
|
629
|
+
|
630
|
+
### `concatenate(other)` or `concat(other)`
|
631
|
+
|
632
|
+
Concatenate other array-like to self and return a concatenated Vector.
|
633
|
+
- `other` is one of `Vector`, `Array`, `Arrow::Array` or `Arrow::ChunkedArray`
|
634
|
+
- Different type will be 'resolved'.
|
635
|
+
|
636
|
+
Concatenate to string
|
637
|
+
```ruby
|
638
|
+
string_vector
|
639
|
+
|
640
|
+
# =>
|
641
|
+
#<RedAmber::Vector(:string, size=2):0x00000000000037b4>
|
642
|
+
["A", "B"]
|
643
|
+
|
644
|
+
string_vector.concatenate([1, 2])
|
645
|
+
|
646
|
+
# =>
|
647
|
+
#<RedAmber::Vector(:string, size=4):0x0000000000003818>
|
648
|
+
["A", "B", "1", "2"]
|
649
|
+
```
|
650
|
+
|
651
|
+
Concatenate to integer
|
652
|
+
|
653
|
+
```ruby
|
654
|
+
integer_vector
|
655
|
+
|
656
|
+
# =>
|
657
|
+
#<RedAmber::Vector(:uint8, size=2):0x000000000000382c>
|
658
|
+
[1, 2]
|
659
|
+
|
660
|
+
nteger_vector.concatenate(["A", "B"])
|
661
|
+
# =>
|
662
|
+
#<RedAmber::Vector(:uint8, size=4):0x0000000000003840>
|
663
|
+
[1, 2, 65, 66]
|
664
|
+
```
|
665
|
+
|
666
|
+
### `rank`
|
667
|
+
|
668
|
+
Returns numerical rank of self.
|
669
|
+
- Nil values are considered greater than any value.
|
670
|
+
- NaN values are considered greater than any value but smaller than nil values.
|
671
|
+
- Tiebreakers are ranked in order of appearance.
|
672
|
+
- `RankOptions` in C++ function is not implemented in C GLib yet.
|
673
|
+
This method is currently fixed to the default behavior.
|
674
|
+
|
675
|
+
Returns 0-based rank of self (0...size in range) as a Vector.
|
676
|
+
|
677
|
+
Rank of float Vector
|
678
|
+
```ruby
|
679
|
+
fv = Vector.new(0.1, nil, Float::NAN, 0.2, 0.1); fv
|
680
|
+
# =>
|
681
|
+
#<RedAmber::Vector(:double, size=5):0x000000000000c65c>
|
682
|
+
[0.1, nil, NaN, 0.2, 0.1]
|
683
|
+
|
684
|
+
fv.rank
|
685
|
+
# =>
|
686
|
+
#<RedAmber::Vector(:uint64, size=5):0x0000000000003868>
|
687
|
+
[0, 4, 3, 2, 1]
|
688
|
+
```
|
689
|
+
|
690
|
+
Rank of string Vector
|
691
|
+
```ruby
|
692
|
+
sv = Vector.new("A", "B", nil, "A", "C"); sv
|
693
|
+
# =>
|
694
|
+
#<RedAmber::Vector(:string, size=5):0x0000000000003854>
|
695
|
+
["A", "B", nil, "A", "C"]
|
696
|
+
|
697
|
+
sv.rank
|
698
|
+
# =>
|
699
|
+
#<RedAmber::Vector(:uint64, size=5):0x0000000000003868>
|
700
|
+
[0, 2, 4, 1, 3]
|
701
|
+
```
|
702
|
+
|
703
|
+
### `sample(integer_or_proportion)`
|
704
|
+
|
705
|
+
Pick up elements at random.
|
706
|
+
|
707
|
+
#### `sample` : without agrument
|
708
|
+
|
709
|
+
Return a randomly selected element.
|
710
|
+
This is one of an aggregation function.
|
711
|
+
|
712
|
+
```ruby
|
713
|
+
v = Vector.new('A'..'H'); v
|
714
|
+
# =>
|
715
|
+
#<RedAmber::Vector(:string, size=8):0x0000000000011b20>
|
716
|
+
["A", "B", "C", "D", "E", "F", "G", "H"]
|
717
|
+
|
718
|
+
v.sample
|
719
|
+
# =>
|
720
|
+
"C"
|
721
|
+
```
|
722
|
+
|
723
|
+
#### `sample(n)` : n as a Integer
|
724
|
+
|
725
|
+
Pick up n elements at random.
|
726
|
+
|
727
|
+
- Param `n` is number of elements to pick.
|
728
|
+
- `n` is a positive Integer
|
729
|
+
- If `n` is smaller or equal to size, elements are picked by non-repeating.
|
730
|
+
- If `n` is greater than `size`, elements are picked repeatedly.
|
731
|
+
@return [Vector] sampled elements.
|
732
|
+
- If `n == 1` (in case of `sample(1)`), it returns a Vector of `size == 1` not a scalar.
|
733
|
+
|
734
|
+
```ruby
|
735
|
+
v.sample(1)
|
736
|
+
# =>
|
737
|
+
#<RedAmber::Vector(:string, size=1):0x000000000001a3b0>
|
738
|
+
["H"]
|
739
|
+
```
|
740
|
+
|
741
|
+
Sample same size of self: every element is picked in random order.
|
742
|
+
|
743
|
+
```ruby
|
744
|
+
v.sample(8)
|
745
|
+
# =>
|
746
|
+
#<RedAmber::Vector(:string, size=8):0x000000000001bda0>
|
747
|
+
["H", "D", "B", "F", "E", "A", "G", "C"]
|
748
|
+
```
|
749
|
+
|
750
|
+
Over sampling: "E" and "A" are sampled repeatedly.
|
751
|
+
|
752
|
+
```ruby
|
753
|
+
v.sample(9)
|
754
|
+
# =>
|
755
|
+
#<RedAmber::Vector(:string, size=9):0x000000000001d790>
|
756
|
+
["E", "E", "A", "D", "H", "C", "A", "F", "H"]
|
757
|
+
```
|
758
|
+
|
759
|
+
#### `sample(prop)` : prop as a Float
|
760
|
+
|
761
|
+
Pick up elements by proportion `prop` at random.
|
762
|
+
|
763
|
+
- `prop` is proportion of elements to pick.
|
764
|
+
- `prop` is a positive Float.
|
765
|
+
- Absolute number of elements to pick:`prop*size` is rounded (by `half: :up`).
|
766
|
+
- If `prop` is smaller or equal to 1.0, elements are picked by non-repeating.
|
767
|
+
- If `prop` is greater than 1.0, some elements are picked repeatedly.
|
768
|
+
- Returns sampled elements by a Vector.
|
769
|
+
- If picked element is only one, it returns a Vector of `size == 1` not a scalar.
|
770
|
+
|
771
|
+
Sample same size of self: every element is picked in random order.
|
772
|
+
|
773
|
+
```ruby
|
774
|
+
v.sample(1.0)
|
775
|
+
# =>
|
776
|
+
#<RedAmber::Vector(:string, size=8):0x000000000001bda0>
|
777
|
+
["D", "H", "F", "C", "A", "B", "E", "G"]
|
778
|
+
```
|
779
|
+
|
780
|
+
2 times over sampling.
|
781
|
+
|
782
|
+
```ruby
|
783
|
+
v.sample(2.0)
|
784
|
+
# =>
|
785
|
+
#<RedAmber::Vector(:string, size=16):0x00000000000233e8>
|
786
|
+
["H", "B", "C", "B", "C", "A", "F", "A", "E", "C", "H", "F", "F", "A", ... ]
|
787
|
+
```
|
788
|
+
|
789
|
+
### `sort(integer_or_proportion)`
|
790
|
+
|
791
|
+
Arrange values in Vector.
|
792
|
+
|
793
|
+
- `:+`, `:ascending` or without argument will sort in increasing order.
|
794
|
+
- `:-` or `:descending` will sort in decreasing order.
|
795
|
+
|
796
|
+
```ruby
|
797
|
+
Vector.new(%w[B D A E C]).sort
|
798
|
+
# same as #sort(:+)
|
799
|
+
# same as #sort(:ascending)
|
800
|
+
# =>
|
801
|
+
#<RedAmber::Vector(:string, size=5):0x000000000000c134>
|
802
|
+
["A", "B", "C", "D", "E"]
|
803
|
+
|
804
|
+
Vector.new(%w[B D A E C]).sort(:-)
|
805
|
+
# same as #sort(:descending)
|
806
|
+
# =>
|
807
|
+
#<RedAmber::Vector(:string, size=5):0x000000000000c148>
|
808
|
+
["E", "D", "C", "B", "A"]
|
809
|
+
```
|