Addition permanente d'une colonne dans une table en mode organisationnel

87

Dans une table Emacs Org-mode, lorsque vous avez une colonne pleine d'entiers, je sais que vous pouvez faire C-c +suivi de C-ypour coller la somme des valeurs dans la colonne. Je veux connaître la formule à placer dans la dernière ligne pour toujours additionner toute la colonne.

J'ai tout essayé. Les documents vous montrent comment additionner deux colonnes mais pas une.

Mauvis Ledford
la source
4
Le mieux que j'ai pu obtenir est d'ajouter un highline en haut et en bas du tableau et de faire une formule de colonne: = vsum (@I .. @ II)
Mauvis Ledford
En tant que FYI, je viens de publier une question similaire sur le ciblage hline ici: stackoverflow.com/questions/6689424/ ... Cette question est déjà en train de recevoir des votes et la réponse peut être différente, donc je la laisserai en attendant.
Mauvis Ledford le

Réponses:

60

Attribuez un nom de champ à l'aide de la ^marque:

|---+---|
|   | 1 |
|   | 2 |
|   | 3 |
|---+---|
|   | 6 |
| ^ | x |
|---+---|
#+TBLFM: $x=vsum(@1..@-1)

Voir le manuel de l'organisation , Section-3.5.9 Fonctions avancées .

huaiyuan
la source
Merci! Cela finit par fonctionner plutôt bien et je suis d'accord avec cela, cependant, j'ai maintenant un hline "header" et un hline "footer" avec les mêmes choses. Y a-t-il un moyen d'y parvenir en utilisant uniquement l'en-tête hline. Dans la documentation, c'est le marquage "-", mais je ne sais pas comment utiliser vsum (@ 2 .. @ [dernier élément]).
Mauvis Ledford le
4
Vous pouvez aussi faire#+TBLFM: @row$col=vsum(@1..@-1)
mgalgs
7
Je reçoisUnknown field: x
incandescentman
J'ai aussi un champ inconnu. Lisez le manuel, essentiellement dans l'exemple ci-dessus, il appelle la ligne au-dessus du ^ xx, de sorte que le 6 soit calculé à partir du vsum de 1, 2, 3.
Japhir
57

La dernière ligne d'un tableau est @> Par exemple pour obtenir la somme de la troisième colonne de la dernière ligne, vous pouvez utiliser la formule

@>$3=vsum(@2..@-1)

Peut-être devrez-vous adapter le @2, si vous n'avez pas de ligne d'en-tête ...

André
la source
40

Encore une autre possibilité marques utilisent des lignes horizontales ( @I, @II, etc.) qui sont de toute façon utile de structurer votre table:

| What  |    $$ |
|-------+-------|
| Ice   |  3.00 |
| Soda  |  6.49 |
| Gin   |  4.99 |
|-------+-------|
| Total | 14.48 |
#+TBLFM: @>$2=vsum(@I..@II)

Sans en-tête, laissez la somme commencer @0comme suggéré par d'autres.

Edit: Je viens de voir que vous avez déjà écrit cela vous-même dans un commentaire à votre question.

quazgar
la source
Il m'a fallu une minute pour comprendre que @I et @II font référence aux règles horizontales, mais je pense que c'est le moyen le plus simple de le faire si vous organisez votre tableau de cette façon.
threeve le
9

Vous pouvez essayer ceci:

$<col_num>=<func>(@2..@-1))

@2est statique. Il fait référence à la 2ème rangée à partir de. @-1fait référence à l'avant-dernière ligne.

Je pense que c'était le moyen le plus simple et non intrusif. Il préserve les noms de vos colonnes et n'encombre pas l'espace visuel. Il ne vous oblige pas à vous adresser à la dernière ligne. Il est adressé par défaut.

Les lignes peuvent être ajoutées / supprimées. Aucun autre marqueur.

par exemple.
#+TBLFM: $3=vmean(@2..@-1)::$4=vsum(@2..@-1))

Exemple de tableau

   | Time                   | Input             | Test      | InQty |
   | <2018-03-13 Tue 06:15> | Water             |           |   200 |
   | <2018-03-13 Tue 07:03> |                   |           |       |
   |                        |                   |           |       |
   | <2018-03-13 Tue 07:31> | Water             |           |   180 |
   | <2018-03-13 Tue 09:00> | Chai              |           |   240 |
   | <2018-03-13 Tue 11:30> | Chai              |           |   240 |
   | <2018-03-13 Tue 16:01> | Water             |           |    60 |
   |                        |                   |           |       |
   |------------------------+-------------------+-----------+-------|
   |                        |                   |           |   920 |
   #+TBLFM: $4=vsum(@2..@-1)
Johnson
la source
0
|  3 |
|  2 |
|  5 |
| 10 |
#+TBLFM: @4$1=vsum(@1..@-1)

@1fait référence à la 1ère ligne et @-1à la ligne précédant celle contenant la formule. Cette formule ignore les lignes:

|  3 |
|  2 |
|  5 |
|----|
| 10 |
#+TBLFM: @4$1=vsum(@1..@-1)
Louis Strous
la source
0

Quelque chose qui peut ne pas être évident pour un lecteur est que la fonction n'est vsum()pas sum ()

L'autre chose, c'est que la @2..@-1chose, est une référence à l'étiquette spécifique à la ligne pour la colonne en cours d'addition. La $A$1chose dans Excel est comme @1$1si une référence à vsum(@2..@-1)est de dire "faites une somme des valeurs de la colonne, en utilisant comme index de ligne la @valeur de la plage 2, à la -1e (c'est-à-dire l'avant-dernière) ligne, mais la colonne est un "donné" dans celui-ci afin que son vsum soit appliqué [@2$col @3$col @4$col... @-1$col]si vous essayez de mapper ces concepts dans Excel

George Michaelson
la source