red_amber 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +20 -5
- data/CHANGELOG.md +68 -3
- data/README.md +6 -6
- 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 -6
- data/lib/red_amber/data_frame.rb +25 -10
- data/lib/red_amber/data_frame_combinable.rb +117 -73
- data/lib/red_amber/data_frame_displayable.rb +100 -51
- data/lib/red_amber/data_frame_indexable.rb +4 -4
- data/lib/red_amber/data_frame_reshaping.rb +1 -1
- data/lib/red_amber/data_frame_selectable.rb +1 -4
- data/lib/red_amber/data_frame_variable_operation.rb +7 -2
- data/lib/red_amber/group.rb +1 -2
- data/lib/red_amber/helper.rb +4 -4
- data/lib/red_amber/refinements.rb +15 -2
- data/lib/red_amber/subframes.rb +173 -138
- data/lib/red_amber/vector.rb +7 -30
- data/lib/red_amber/vector_binary_element_wise.rb +120 -1
- data/lib/red_amber/vector_selectable.rb +49 -12
- data/lib/red_amber/vector_unary_element_wise.rb +93 -0
- data/lib/red_amber/version.rb +1 -1
- metadata +3 -3
@@ -31,6 +31,8 @@ module RedAmber
|
|
31
31
|
# 2 3 C
|
32
32
|
# 3 4 D
|
33
33
|
#
|
34
|
+
# @since 0.2.3
|
35
|
+
#
|
34
36
|
def concatenate(*other)
|
35
37
|
case other
|
36
38
|
in [] | [nil] | [[]]
|
@@ -79,6 +81,8 @@ module RedAmber
|
|
79
81
|
# 0 1 3 A C
|
80
82
|
# 1 2 4 B D
|
81
83
|
#
|
84
|
+
# @since 0.2.3
|
85
|
+
#
|
82
86
|
def merge(*other)
|
83
87
|
case other
|
84
88
|
in [] | [nil] | [[]]
|
@@ -121,7 +125,7 @@ module RedAmber
|
|
121
125
|
# @param other [DataFrame, Arrow::Table]
|
122
126
|
# A DataFrame or a Table to be joined with self.
|
123
127
|
#
|
124
|
-
# @!macro
|
128
|
+
# @!macro join_force_order
|
125
129
|
# @param force_order [Boolean]
|
126
130
|
# wheather force order of the output always same.
|
127
131
|
# - This option is used in `:full_outer` and `:right_outer`.
|
@@ -217,11 +221,12 @@ module RedAmber
|
|
217
221
|
# - Same as `#join` with `type: :inner`
|
218
222
|
# - A kind of mutating join.
|
219
223
|
#
|
220
|
-
# @overload inner_join(other, suffix: '.1')
|
224
|
+
# @overload inner_join(other, suffix: '.1', force_order: true)
|
221
225
|
# If `join_key` is not specified, common keys in self and other are used
|
222
226
|
# (natural keys). Returns joined dataframe.
|
223
227
|
#
|
224
228
|
# @macro join_before
|
229
|
+
# @macro join_force_order
|
225
230
|
# @macro join_after
|
226
231
|
# @macro join_common_example_1
|
227
232
|
# @example without key (use implicit common key)
|
@@ -233,10 +238,11 @@ module RedAmber
|
|
233
238
|
# 0 A 1 true
|
234
239
|
# 1 B 2 false
|
235
240
|
#
|
236
|
-
# @overload inner_join(other, join_keys, suffix: '.1')
|
241
|
+
# @overload inner_join(other, join_keys, suffix: '.1', force_order: true)
|
237
242
|
#
|
238
243
|
# @macro join_before
|
239
244
|
# @macro join_key_in_array
|
245
|
+
# @macro join_force_order
|
240
246
|
# @macro join_after
|
241
247
|
# @macro join_common_example_1
|
242
248
|
# @example with a key
|
@@ -248,10 +254,11 @@ module RedAmber
|
|
248
254
|
# 0 A 1 true
|
249
255
|
# 1 B 2 false
|
250
256
|
#
|
251
|
-
# @overload inner_join(other, join_key_pairs, suffix: '.1')
|
257
|
+
# @overload inner_join(other, join_key_pairs, suffix: '.1', force_order: true)
|
252
258
|
#
|
253
259
|
# @macro join_before
|
254
260
|
# @macro join_key_in_hash
|
261
|
+
# @macro join_force_order
|
255
262
|
# @macro join_after
|
256
263
|
# @macro join_common_example_2
|
257
264
|
# @example with key pairs
|
@@ -263,8 +270,10 @@ module RedAmber
|
|
263
270
|
# 0 A 1 true
|
264
271
|
# 1 B 2 false
|
265
272
|
#
|
266
|
-
|
267
|
-
|
273
|
+
# @since 0.2.3
|
274
|
+
#
|
275
|
+
def inner_join(other, join_keys = nil, suffix: '.1', force_order: true)
|
276
|
+
join(other, join_keys, type: :inner, suffix: suffix, force_order: force_order)
|
268
277
|
end
|
269
278
|
|
270
279
|
# Join another DataFrame or Table, leaving all records.
|
@@ -276,7 +285,7 @@ module RedAmber
|
|
276
285
|
# (natural keys). Returns joined dataframe.
|
277
286
|
#
|
278
287
|
# @macro join_before
|
279
|
-
# @macro
|
288
|
+
# @macro join_force_order
|
280
289
|
# @macro join_after
|
281
290
|
# @macro join_common_example_1
|
282
291
|
# @example without key (use implicit common key)
|
@@ -294,7 +303,7 @@ module RedAmber
|
|
294
303
|
#
|
295
304
|
# @macro join_before
|
296
305
|
# @macro join_key_in_array
|
297
|
-
# @macro
|
306
|
+
# @macro join_force_order
|
298
307
|
# @macro join_after
|
299
308
|
# @macro join_common_example_1
|
300
309
|
# @example with a key
|
@@ -312,7 +321,7 @@ module RedAmber
|
|
312
321
|
#
|
313
322
|
# @macro join_before
|
314
323
|
# @macro join_key_in_hash
|
315
|
-
# @macro
|
324
|
+
# @macro join_force_order
|
316
325
|
# @macro join_after
|
317
326
|
# @macro join_common_example_2
|
318
327
|
# @example with key pairs
|
@@ -326,6 +335,8 @@ module RedAmber
|
|
326
335
|
# 2 C 3 (nil)
|
327
336
|
# 3 D (nil) (nil)
|
328
337
|
#
|
338
|
+
# @since 0.2.3
|
339
|
+
#
|
329
340
|
def full_join(other, join_keys = nil, suffix: '.1', force_order: true)
|
330
341
|
join(other, join_keys,
|
331
342
|
type: :full_outer, suffix: suffix, force_order: force_order)
|
@@ -337,11 +348,12 @@ module RedAmber
|
|
337
348
|
# - Same as `#join` with `type: :left_outer`
|
338
349
|
# - A kind of mutating join.
|
339
350
|
#
|
340
|
-
# @overload left_join(other, suffix: '.1')
|
351
|
+
# @overload left_join(other, suffix: '.1', force_order: true)
|
341
352
|
# If `join_key` is not specified, common keys in self and other are used
|
342
353
|
# (natural keys). Returns joined dataframe.
|
343
354
|
#
|
344
355
|
# @macro join_before
|
356
|
+
# @macro join_force_order
|
345
357
|
# @macro join_after
|
346
358
|
# @macro join_common_example_1
|
347
359
|
# @example without key (use implicit common key)
|
@@ -354,10 +366,11 @@ module RedAmber
|
|
354
366
|
# 1 B 2 false
|
355
367
|
# 2 C 3 (nil)
|
356
368
|
#
|
357
|
-
# @overload left_join(other, join_keys, suffix: '.1')
|
369
|
+
# @overload left_join(other, join_keys, suffix: '.1', force_order: true)
|
358
370
|
#
|
359
371
|
# @macro join_before
|
360
372
|
# @macro join_key_in_array
|
373
|
+
# @macro join_force_order
|
361
374
|
# @macro join_after
|
362
375
|
# @macro join_common_example_1
|
363
376
|
# @example with a key
|
@@ -370,10 +383,11 @@ module RedAmber
|
|
370
383
|
# 1 B 2 false
|
371
384
|
# 2 C 3 (nil)
|
372
385
|
#
|
373
|
-
# @overload left_join(other, join_key_pairs, suffix: '.1')
|
386
|
+
# @overload left_join(other, join_key_pairs, suffix: '.1', force_order: true)
|
374
387
|
#
|
375
388
|
# @macro join_before
|
376
389
|
# @macro join_key_in_hash
|
390
|
+
# @macro join_force_order
|
377
391
|
# @macro join_after
|
378
392
|
# @macro join_common_example_2
|
379
393
|
# @example with key pairs
|
@@ -386,8 +400,10 @@ module RedAmber
|
|
386
400
|
# 1 B 2 false
|
387
401
|
# 2 C 3 (nil)
|
388
402
|
#
|
389
|
-
|
390
|
-
|
403
|
+
# @since 0.2.3
|
404
|
+
#
|
405
|
+
def left_join(other, join_keys = nil, suffix: '.1', force_order: true)
|
406
|
+
join(other, join_keys, type: :left_outer, suffix: suffix, force_order: force_order)
|
391
407
|
end
|
392
408
|
|
393
409
|
# Join matching values from self to other.
|
@@ -399,7 +415,7 @@ module RedAmber
|
|
399
415
|
# (natural keys). Returns joined dataframe.
|
400
416
|
#
|
401
417
|
# @macro join_before
|
402
|
-
# @macro
|
418
|
+
# @macro join_force_order
|
403
419
|
# @macro join_after
|
404
420
|
# @macro join_common_example_1
|
405
421
|
# @example without key (use implicit common key)
|
@@ -416,7 +432,7 @@ module RedAmber
|
|
416
432
|
#
|
417
433
|
# @macro join_before
|
418
434
|
# @macro join_key_in_array
|
419
|
-
# @macro
|
435
|
+
# @macro join_force_order
|
420
436
|
# @macro join_after
|
421
437
|
# @macro join_common_example_1
|
422
438
|
# @example with a key
|
@@ -433,7 +449,7 @@ module RedAmber
|
|
433
449
|
#
|
434
450
|
# @macro join_before
|
435
451
|
# @macro join_key_in_hash
|
436
|
-
# @macro
|
452
|
+
# @macro join_force_order
|
437
453
|
# @macro join_after
|
438
454
|
# @macro join_common_example_2
|
439
455
|
# @example with key pairs
|
@@ -446,6 +462,8 @@ module RedAmber
|
|
446
462
|
# 1 B 2 false
|
447
463
|
# 2 D (nil) (nil)
|
448
464
|
#
|
465
|
+
# @since 0.2.3
|
466
|
+
#
|
449
467
|
def right_join(other, join_keys = nil, suffix: '.1', force_order: true)
|
450
468
|
join(
|
451
469
|
other,
|
@@ -462,11 +480,12 @@ module RedAmber
|
|
462
480
|
# - Same as `#join` with `type: :left_semi`
|
463
481
|
# - A kind of filtering join.
|
464
482
|
#
|
465
|
-
# @overload semi_join(other, suffix: '.1')
|
483
|
+
# @overload semi_join(other, suffix: '.1', force_order: true)
|
466
484
|
# If `join_key` is not specified, common keys in self and other are used
|
467
485
|
# (natural keys). Returns joined dataframe.
|
468
486
|
#
|
469
487
|
# @macro join_before
|
488
|
+
# @macro join_force_order
|
470
489
|
# @macro join_after
|
471
490
|
# @macro join_common_example_1
|
472
491
|
# @example without key (use implicit common key)
|
@@ -478,10 +497,11 @@ module RedAmber
|
|
478
497
|
# 0 A 1
|
479
498
|
# 1 B 2
|
480
499
|
#
|
481
|
-
# @overload semi_join(other, join_keys, suffix: '.1')
|
500
|
+
# @overload semi_join(other, join_keys, suffix: '.1', force_order: true)
|
482
501
|
#
|
483
502
|
# @macro join_before
|
484
503
|
# @macro join_key_in_array
|
504
|
+
# @macro join_force_order
|
485
505
|
# @macro join_after
|
486
506
|
# @macro join_common_example_1
|
487
507
|
# @example with a key
|
@@ -493,10 +513,11 @@ module RedAmber
|
|
493
513
|
# 0 A 1
|
494
514
|
# 1 B 2
|
495
515
|
#
|
496
|
-
# @overload semi_join(other, join_key_pairs, suffix: '.1')
|
516
|
+
# @overload semi_join(other, join_key_pairs, suffix: '.1', force_order: true)
|
497
517
|
#
|
498
518
|
# @macro join_before
|
499
519
|
# @macro join_key_in_hash
|
520
|
+
# @macro join_force_order
|
500
521
|
# @macro join_after
|
501
522
|
# @macro join_common_example_2
|
502
523
|
# @example with key pairs
|
@@ -508,19 +529,22 @@ module RedAmber
|
|
508
529
|
# 0 A 1
|
509
530
|
# 1 B 2
|
510
531
|
#
|
511
|
-
|
512
|
-
|
532
|
+
# @since 0.2.3
|
533
|
+
#
|
534
|
+
def semi_join(other, join_keys = nil, suffix: '.1', force_order: true)
|
535
|
+
join(other, join_keys, type: :left_semi, suffix: suffix, force_order: force_order)
|
513
536
|
end
|
514
537
|
|
515
538
|
# Return records of self that do not have a match in other.
|
516
539
|
# - Same as `#join` with `type: :left_anti`
|
517
540
|
# - A kind of filtering join.
|
518
541
|
#
|
519
|
-
# @overload anti_join(other, suffix: '.1')
|
542
|
+
# @overload anti_join(other, suffix: '.1', force_order: true)
|
520
543
|
# If `join_key` is not specified, common keys in self and other are used
|
521
544
|
# (natural keys). Returns joined dataframe.
|
522
545
|
#
|
523
546
|
# @macro join_before
|
547
|
+
# @macro join_force_order
|
524
548
|
# @macro join_after
|
525
549
|
# @macro join_common_example_1
|
526
550
|
# @example without key (use implicit common key)
|
@@ -531,10 +555,11 @@ module RedAmber
|
|
531
555
|
# <string> <uint8>
|
532
556
|
# 0 C 3
|
533
557
|
#
|
534
|
-
# @overload anti_join(other, join_keys, suffix: '.1')
|
558
|
+
# @overload anti_join(other, join_keys, suffix: '.1', force_order: true)
|
535
559
|
#
|
536
560
|
# @macro join_before
|
537
561
|
# @macro join_key_in_array
|
562
|
+
# @macro join_force_order
|
538
563
|
# @macro join_after
|
539
564
|
# @macro join_common_example_1
|
540
565
|
# @example with a key
|
@@ -545,10 +570,11 @@ module RedAmber
|
|
545
570
|
# <string> <uint8>
|
546
571
|
# 0 C 3
|
547
572
|
#
|
548
|
-
# @overload anti_join(other, join_key_pairs, suffix: '.1')
|
573
|
+
# @overload anti_join(other, join_key_pairs, suffix: '.1', force_order: true)
|
549
574
|
#
|
550
575
|
# @macro join_before
|
551
576
|
# @macro join_key_in_hash
|
577
|
+
# @macro join_force_order
|
552
578
|
# @macro join_after
|
553
579
|
# @macro join_common_example_2
|
554
580
|
# @example with key pairs
|
@@ -559,8 +585,10 @@ module RedAmber
|
|
559
585
|
# <string> <uint8>
|
560
586
|
# 0 C 3
|
561
587
|
#
|
562
|
-
|
563
|
-
|
588
|
+
# @since 0.2.3
|
589
|
+
#
|
590
|
+
def anti_join(other, join_keys = nil, suffix: '.1', force_order: true)
|
591
|
+
join(other, join_keys, type: :left_anti, suffix: suffix, force_order: force_order)
|
564
592
|
end
|
565
593
|
|
566
594
|
# Set operations (#intersect, #union, #difference, #set_operable?)
|
@@ -574,6 +602,8 @@ module RedAmber
|
|
574
602
|
# @example
|
575
603
|
# df3.set_operable?(other3) # => true
|
576
604
|
#
|
605
|
+
# @since 0.2.3
|
606
|
+
#
|
577
607
|
def set_operable?(other) # rubocop:disable Naming/AccessorMethodName
|
578
608
|
keys == other.keys.map(&:to_sym)
|
579
609
|
end
|
@@ -594,6 +624,8 @@ module RedAmber
|
|
594
624
|
# <string> <uint8>
|
595
625
|
# 0 A 1
|
596
626
|
#
|
627
|
+
# @since 0.2.3
|
628
|
+
#
|
597
629
|
def intersect(other)
|
598
630
|
unless keys == other.keys.map(&:to_sym)
|
599
631
|
raise DataFrameArgumentError, 'keys are not same with self and other'
|
@@ -622,6 +654,8 @@ module RedAmber
|
|
622
654
|
# 3 B 4
|
623
655
|
# 4 D 5
|
624
656
|
#
|
657
|
+
# @since 0.2.3
|
658
|
+
#
|
625
659
|
def union(other)
|
626
660
|
unless keys == other.keys.map(&:to_sym)
|
627
661
|
raise DataFrameArgumentError, 'keys are not same with self and other'
|
@@ -655,6 +689,8 @@ module RedAmber
|
|
655
689
|
# 0 B 4
|
656
690
|
# 1 D 5
|
657
691
|
#
|
692
|
+
# @since 0.2.3
|
693
|
+
#
|
658
694
|
def difference(other)
|
659
695
|
unless keys == other.keys.map(&:to_sym)
|
660
696
|
raise DataFrameArgumentError, 'keys are not same with self and other'
|
@@ -709,7 +745,7 @@ module RedAmber
|
|
709
745
|
#
|
710
746
|
# @macro join_before
|
711
747
|
# @macro join_common_type
|
712
|
-
# @macro
|
748
|
+
# @macro join_force_order
|
713
749
|
# @macro join_after
|
714
750
|
# @macro join_common_example_1
|
715
751
|
# @example
|
@@ -736,7 +772,7 @@ module RedAmber
|
|
736
772
|
# @macro join_before
|
737
773
|
# @macro join_key_in_array
|
738
774
|
# @macro join_common_type
|
739
|
-
# @macro
|
775
|
+
# @macro join_force_order
|
740
776
|
# @macro join_after
|
741
777
|
# @macro join_common_example_3
|
742
778
|
# @example join keys in an Array
|
@@ -761,7 +797,7 @@ module RedAmber
|
|
761
797
|
# @macro join_before
|
762
798
|
# @macro join_key_in_hash
|
763
799
|
# @macro join_common_type
|
764
|
-
# @macro
|
800
|
+
# @macro join_force_order
|
765
801
|
# @macro join_after
|
766
802
|
# @macro join_common_example_4
|
767
803
|
# @example without options
|
@@ -790,6 +826,8 @@ module RedAmber
|
|
790
826
|
# 0 A D e
|
791
827
|
# 1 B E E
|
792
828
|
#
|
829
|
+
# @since 0.2.3
|
830
|
+
#
|
793
831
|
def join(other, join_keys = nil, type: :inner, suffix: '.1', force_order: true)
|
794
832
|
right_table =
|
795
833
|
case other
|
@@ -804,7 +842,7 @@ module RedAmber
|
|
804
842
|
type = type.to_sym
|
805
843
|
left_index = :__LEFT_INDEX__
|
806
844
|
right_index = :__RIGHT_INDEX__
|
807
|
-
if force_order
|
845
|
+
if force_order
|
808
846
|
left_table = assign(left_index) { indices }.table
|
809
847
|
other = DataFrame.create(other) if other.is_a?(Arrow::Table)
|
810
848
|
right_table = other.assign(right_index) { indices }.table
|
@@ -820,14 +858,12 @@ module RedAmber
|
|
820
858
|
|
821
859
|
# This is not necessary if additional procedure is contributed to Red Arrow.
|
822
860
|
if join_keys.is_a?(Hash)
|
823
|
-
left_keys = join_keys[:left]
|
824
|
-
right_keys = join_keys[:right]
|
861
|
+
left_keys = ensure_keys(join_keys[:left])
|
862
|
+
right_keys = ensure_keys(join_keys[:right])
|
825
863
|
else
|
826
|
-
left_keys = join_keys
|
827
|
-
right_keys =
|
864
|
+
left_keys = ensure_keys(join_keys)
|
865
|
+
right_keys = left_keys
|
828
866
|
end
|
829
|
-
left_keys = Array(left_keys).map(&:to_s)
|
830
|
-
right_keys = Array(right_keys).map(&:to_s)
|
831
867
|
|
832
868
|
case type
|
833
869
|
when :full_outer, :left_semi, :left_anti, :right_semi, :right_anti
|
@@ -853,26 +889,36 @@ module RedAmber
|
|
853
889
|
|
854
890
|
case type
|
855
891
|
when :inner, :left_outer, :left_semi, :left_anti, :right_semi, :right_anti
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
892
|
+
dataframe =
|
893
|
+
if joined_table.keys.uniq!
|
894
|
+
DataFrame.create(rename_table(joined_table, n_keys, suffix))
|
895
|
+
else
|
896
|
+
DataFrame.create(joined_table)
|
897
|
+
end
|
898
|
+
sorter =
|
899
|
+
case type
|
900
|
+
when :inner, :left_outer
|
901
|
+
[left_index, right_index]
|
902
|
+
when :left_semi, :left_anti
|
903
|
+
[left_index]
|
904
|
+
when :right_semi, :right_anti
|
905
|
+
[right_index]
|
906
|
+
end
|
861
907
|
when :full_outer
|
908
|
+
key_index_lr =
|
909
|
+
left_keys.map { left_table.keys.index(_1) }
|
910
|
+
.zip(right_keys.map { left_table.keys.size + right_table.keys.index(_1) })
|
862
911
|
renamed_table = rename_table(joined_table, n_keys, suffix)
|
863
|
-
renamed_keys = renamed_table.keys
|
864
912
|
dropper = []
|
865
|
-
dataframe =
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
913
|
+
dataframe =
|
914
|
+
DataFrame.create(renamed_table).assign do |df|
|
915
|
+
key_index_lr.map do |l, r|
|
916
|
+
dropper << df.keys[r]
|
917
|
+
[df.keys[l], merge_array(df.vectors[l].data, df.vectors[r].data)]
|
918
|
+
end
|
871
919
|
end
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
dataframe.drop(dropper, left_index, right_index)
|
920
|
+
dataframe = dataframe.drop(dropper)
|
921
|
+
sorter = [left_index, right_index]
|
876
922
|
when :right_outer
|
877
923
|
dataframe =
|
878
924
|
if joined_table.keys.uniq!
|
@@ -880,20 +926,26 @@ module RedAmber
|
|
880
926
|
else
|
881
927
|
DataFrame.create(joined_table)
|
882
928
|
end
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
929
|
+
dataframe = dataframe.pick(right_keys, dataframe.keys - right_keys)
|
930
|
+
sorter = [left_index, right_index]
|
931
|
+
end
|
932
|
+
|
933
|
+
if force_order
|
934
|
+
dataframe
|
935
|
+
.sort(sorter)
|
936
|
+
.drop(sorter)
|
937
|
+
else
|
938
|
+
dataframe
|
892
939
|
end
|
893
940
|
end
|
894
941
|
|
895
942
|
private
|
896
943
|
|
944
|
+
# To ensure Array of Symbols
|
945
|
+
def ensure_keys(keys)
|
946
|
+
Array(keys).map(&:to_sym)
|
947
|
+
end
|
948
|
+
|
897
949
|
# Rename duplicate keys by suffix
|
898
950
|
def rename_table(joined_table, n_keys, suffix)
|
899
951
|
joined_keys = joined_table.keys
|
@@ -903,17 +955,9 @@ module RedAmber
|
|
903
955
|
renamed_right_keys =
|
904
956
|
other_keys.map do |key|
|
905
957
|
if dup_keys.include?(key)
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
break unless joined_keys.include?(new_key)
|
910
|
-
|
911
|
-
s = suffix.succ
|
912
|
-
raise DataFrameArgumentError, "suffix #{suffix} is invalid" if s == suffix
|
913
|
-
|
914
|
-
suffix = s
|
915
|
-
end
|
916
|
-
new_key
|
958
|
+
suffixed = "#{key}#{suffix}".to_sym
|
959
|
+
# Find a key from suffixed.succ
|
960
|
+
(suffixed..).find { !joined_keys.include?(_1) }
|
917
961
|
else
|
918
962
|
key
|
919
963
|
end
|