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.


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 .


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 ...


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.


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)

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)

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.