Next: Most frequent values, Previous: Basics, Up: Statistics [Contents]
(mu:tabulate <procedure> [<search-expr>]) applies <procedure> to each
message matching <search-expr> (leave empty to match all messages),
and returns a associative list (a list of pairs) with each of the different
results of <procedure> and their frequencies. For fields that contain lists
of values (such as address-fields), each of the values in the list is added
separately.
We demonstrate mu:tabulate with an example. Suppose we want to know how
many messages we receive per weekday:
#!/bin/sh
exec guile -s $0 $ !#
(use-modules (mu) (mu stats) (mu plot))
(mu:initialize)
;; create a list like (("Sun" . 13) ("Mon" . 23) ...)
(define weekday-table
(mu:weekday-numbers->names
(sort
(mu:tabulate
(lambda (msg)
(tm:wday (localtime (mu:date msg)))))
(lambda (a b) (< (car a) (car b))))))
(for-each
(lambda (elm)
(format #t "~a: ~a\n" (car elm) (cdr elm)))
weekday-table)
The procedure weekday-table uses mu:tabulate-message to get the
frequencies per hour – this returns a list of pairs:
((5 . 2339) (0 . 2278) (4 . 2800) (2 . 3184) (6 . 1856) (3 . 2833) (1 . 2993))
We sort these pairs by the day number, and then apply
mu:weekday-numbers->names, which takes the list, and returns a list
where the day numbers are replace by there abbreviated name (in the current
locale). Note, there is also mu:month-numbers->names.
The script then outputs these numbers in the following form:
Sun: 2278 Mon: 2993 Tue: 3184 Wed: 2833 Thu: 2800 Fri: 2339 Sat: 1856
Clearly, Saturday is a slow day for e-mail...