sourcelibs/Grouping/src/Grouping.xtl

1⍝# Grouping: grouping by key -- the groups, and counts, sums, means, 2⍝# least and greatest per key, or any function per key. 3⍝# Import it with an alias of your choice: "gr:" u_se< "Grouping". 4⍝# Put libs/Grouping/src on XETAL_PATH ("just path"); the reference is libs/Grouping/docs. 5⍝# Names with l: are exported; those under h: are private to this file. 6⍝# 7⍝# Keys and values are lists of one length: item i of the values 8⍝# belongs to key i. Keys may be numbers, characters or texts (boxes). 9⍝# Every result has one item per distinct key, in the order of 10⍝# u_nique keys (first seen first), as APL's key operator gives them. 11 12⍝## Grouping 13 14⍝# keys g_roups values: the values of each key, a list per key. 15ˡg̲roups ← { k v → '{ u → (k = u) r̲eplicate v } m̲ap u̲nique k } 16 17⍝# keys 'f b_y values: f applied to each key's values (f gives one 18⍝# number per group): keys '{ '+ r_/ _r } gr:b_y values. 19ˡb̲y ← { f̲ k v → '{ u → f̲ (k = u) r̲eplicate v } e̲ach u̲nique k } 20 21⍝## Per-key summaries 22 23⍝# gr:c_ount keys: how many items each key has. 24ˡc̲ount ← { k → '{ u → t̲ally w̲here k = u } e̲ach u̲nique k } 25 26⍝# keys s_um values, keys m_ean values: per key. 27ˡs̲um ← { k v → k '{ '+ r̲/ ⍵ } ˡb̲y v } 28ˡm̲ean ← { k v → (f̲loat k ˡs̲um v) ÷ f̲loat ˡc̲ount k } 29 30⍝# keys l_east values, keys g_reatest values: per key. 31ˡl̲east ← { k v → k '{ 'm̲in r̲/ ⍵ } ˡb̲y v } 32ˡg̲reatest ← { k v → k '{ 'm̲ax r̲/ ⍵ } ˡb̲y v }