Fri Jan 5 13:46:37 2018 by wyrdR |
Hi Torben, Happy New Year! Last year I created set of functions to return all Modal numbers [the most frequently appearing numbers in a set. While it appears to almost work, I am certain it is slow and unwieldy. I wonder if you can: a. Suggest any improvements for my functions; b. Consider making a built-in operator similar to maximal & minimal that returns the modal numbers. Thanks in advance, wyrdR ------------------------------ \ Modal \ wyrdR 2018.01.05 \ List the most frequent items in a collection (mode) function freq(collection)= \ List of frequencies foreach item in (different collection) do count (item = collection) function withfreq(collection,freq) = \ Find item in collection with a given frequency freq & foreach item in (different collection) do ((count (item = collection)) keep freq) & item function modal(collection)= \ Get the list of mode(s) if any call withfreq( collection, max (call freq(collection)) ) M:= 5d6 ; [M, call modal(M)] |
Fri Jan 5 16:06:31 2018 by wyrdR |
A built-in 'freq' and 'withfreq' type operator would be cool too. Not sure how feasible it all is, but I have been inspired by maximal, minimal & median. |
Fri Jan 5 16:07:15 2018 by Torben |
A slightly simpler implementation of modal could be:
Basically, it keeps a collection of the items with the highest frequency seen so far, resetting this if a higher frequency is found. As for implementing modal as a standard operator, I'm inclined not to because 1. I don't think it is going to be used by very many people. 2. I don't think it will be much faster if implemented as a standard operator. |
Fri Jan 5 16:11:33 2018 by Torben |
As for making freq a standard operator, I also doubt that it will be used much, and it can be done quite easily with count, as you do. withfreq is a bit more difficult to implement, but it will probably be used even less than freq. |