finances.org 1.7 KB

I like to track my expenses in Org tables. For example:

,#+tblname: daily-expenses ,| Expense | Category | ,|---------+----------| ,| 2 | Food | ,| 1 | House | ,| 10 | Clothes | ,| 3 | Food | ,| 5 | House |

At the of the month, I want to see how much was spent in each category. I wrote the following Babel function to calculate this:

,#+name: group-categories ,#+begin_src emacs-lisp :var table=daily-expenses :colnames nil , (defun category-sums (catcol valcol) , "Sum each of the categories in an Org table. , , \(fn CATEGORYCOLUMN VALUECOLUMN)" , (let (gcats , result) , (dolist (row table) , (let ((cat (nth (1- catcol) row))) , (when (not (member cat gcats)) , (push cat gcats)))) , (dolist (gcat gcats) , (let ((sum 0)) , (dolist (row table) , (let ((val (nth (1- valcol) row)) , (cat (nth (1- catcol) row))) , (when (equal gcat cat) , (incf sum val)))) , (push (list gcat sum) result))) , result)) , (category-sums 2 1) ,#+end_src

Here is an example of the output:

,#+results: group-categories ,| Category | Expense | ,|----------+---------| ,| Food | 5 | ,| House | 6 | ,| Clothes | 10 |

Dan Davison provided an alternate way of doing this using an R function:

,#+begin_src R :var tab=daily-expenses :colnames yes , attach(tab) , aggregate(Expense ~ Category, FUN=sum) ,#+end_src