Dear emacs and org-mode comrades.

Given:

  • a table with
    • a list of tags +
    • their number of appearances in question 1 (Q1) & and question 2 (Q2).
  • org support for tag groups (https://orgmode.org/manual/Tag-Hierarchy.html)
  • 3 defined tag groups
    • GroupTag1 (GT1)=tagA+tagC+tagD and
    • GroupTag2 (GT2)=tagB+tagE
    • GroupTag3 (GT3)=tagB+tagC+tagD (yes, some tags are in more than 1 group)

How can I count with pure elisp (assuming some table formula but I’m open to other ways) the sum of individual tag appearances of each tag group, for each question?

Example:

| tag  | Q1 | Q2 |
|------+----+----|
| tagA |  9 |    |
| tagB |  4 |  2 |
| tagC |  1 |  4 |
| tagD |    |  5 |
| tagE |    |  6 |
|------+----+----|
| GT1  | 10 |  9 |
| GT2  |  4 |  9 |
| GT3  |  5 | 11 |

Thanks a lot for your time and attention… :)

  • sachac@lemmy.ml
    link
    fedilink
    arrow-up
    4
    ·
    1 month ago

    Here’s how I would approach it:

    #+STARTUP: noptag
    #+TAGS:
    #+TAGS: [ GT1 : tagA tagC tagD ]
    #+TAGS: [ GT2 : tagB tagE ]
    #+TAGS: [ GT3 : tagB tagC tagD ]
    
    #+NAME: source
    | tag  | Q1 | Q2 |
    |------+----+----|
    | tagA |  9 |    |
    | tagB |  4 |  2 |
    | tagC |  1 |  4 |
    | tagD |    |  5 |
    | tagE |    |  6 |
    
    #+begin_src emacs-lisp
    (defun my-sum-tag-groups (source)
    	(cons (car source)
    			(mapcar (lambda (tag-group)
    								(let ((tags (org--tags-expand-group (list (car tag-group)) org-tag-groups-alist nil)))
    									(cons (car tag-group)
    												(seq-map-indexed
    												 (lambda (colname i)
    													 (apply '+
    																	(mapcar (lambda (tag)
    																						(let ((val (or (elt (assoc-default tag source) i) "0")))
    																							(if (stringp val)
    																									(string-to-number val)
    																								(or val 0))))
    																					tags)))
    												 (cdr (car source))))))
    							org-tag-groups-alist))
    #+end_src
    
    #+begin_src emacs-lisp :var source=source :colnames no :results table
    (my-sum-tag-groups source)
    #+end_src
    
    #+RESULTS:
    :results:
    | tag | Q1 | Q2 |
    | GT1 | 10 |  9 |
    | GT2 |  4 |  8 |
    | GT3 |  5 | 11 |
    :end:
    
    • EduMerco@lemmy.mlOP
      link
      fedilink
      arrow-up
      2
      ·
      15 days ago

      Dear @sachac@lemmy.ml

      I checked here day after day but didn’t saw your reply under mine until now, I’m so sorry…

      Thank you very much, I will check it right now and come back soon. Slowly, but surely, this is going forward.

      Again, thank you very much. nn()nn b()d

    • EduMerco@lemmy.mlOP
      link
      fedilink
      arrow-up
      1
      ·
      15 days ago

      Dear @sachac (BTW, are you the legendary Sacha Chua?)

      There was a parenthesis missing in the end, but it is working!!! :)))

      I still have to understand the scope (does it works on the heading/ tree where it is called only, can I “point it” to a specific table, etc.) but it is a really great step forward.

      And, as I wanted, it is short, simple, elegant, works perfectly and -specially- shows the power of elisp and how literate programming can be useful and powerful for reproducible research (this is part of my thesis).

      I may continue with some questions, but it helps me a lot to learn.

      Thank you so much! :D

    • Jerkface (any/all)@lemmy.ca
      link
      fedilink
      English
      arrow-up
      1
      ·
      edit-2
      15 days ago

      As enlightening as this was, it must still be noted: publishing code to the wide Internet with a tab width of 2 is dastardly.

  • EduMerco@lemmy.mlOP
    link
    fedilink
    arrow-up
    2
    ·
    1 month ago

    Dear all. I get that it may be a tad complicated, but if anyone sees at least a reference about how it may be done, please do share it here. Thanks a lot, in advance… :)