* making flexible table formulas
@ 2011-02-28 17:35 Rustom Mody
2011-02-28 18:14 ` Luke Crook
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Rustom Mody @ 2011-02-28 17:35 UTC (permalink / raw)
To: emacs-orgmode
[-- Attachment #1.1: Type: text/plain, Size: 787 bytes --]
When using orgmode for hacking on data in a table (org a la spreadsheet) I
have this situation
Say I am concentrating on column 2 and I want the bottom cell to be the sum
of the above cells
For a 7 row table with 8th row having the total I get
#+TBLFM: @8$2=vsum(@1$2..@7$2)
But now I have a problem: If say I add a row to the table then the next time
I recompute the formula(s) the ninth row is not affected and the 8th row
which is now data gets overwritten with a computation.
So basically I want the @1 and @7 which are hardcoded above to be replaced
by something to the effect: "everything above..." and the @8$2 should be
something to the tune of "bottom of $2"
I guess this may not be a reasonable request -- but with org you never know
:-) so asking if there is some way.
[-- Attachment #1.2: Type: text/html, Size: 846 bytes --]
[-- Attachment #2: Type: text/plain, Size: 201 bytes --]
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: making flexible table formulas
2011-02-28 17:35 making flexible table formulas Rustom Mody
@ 2011-02-28 18:14 ` Luke Crook
2011-02-28 18:18 ` Nick Dokos
2011-03-01 9:08 ` Carsten Dominik
2 siblings, 0 replies; 7+ messages in thread
From: Luke Crook @ 2011-02-28 18:14 UTC (permalink / raw)
To: Rustom Mody; +Cc: emacs-orgmode
[-- Attachment #1.1: Type: text/plain, Size: 1082 bytes --]
On Mon, Feb 28, 2011 at 9:35 AM, Rustom Mody <rustompmody@gmail.com> wrote:
> When using orgmode for hacking on data in a table (org a la spreadsheet) I
> have this situation
> Say I am concentrating on column 2 and I want the bottom cell to be the sum
> of the above cells
> For a 7 row table with 8th row having the total I get
>
> #+TBLFM: @8$2=vsum(@1$2..@7$2)
>
> But now I have a problem: If say I add a row to the table then the next
> time I recompute the formula(s) the ninth row is not affected and the 8th
> row which is now data gets overwritten with a computation.
>
> So basically I want the @1 and @7 which are hardcoded above to be replaced
> by something to the effect: "everything above..." and the @8$2 should be
> something to the tune of "bottom of $2"
>
Place the rows you want to sum between horizontal separator lines (see
http://orgmode.org/manual/Built_002din-table-editor.html#Built_002din-table-editor
)
Then you can do the following:
#+TBLFM: @8$2=vsum(@I..@II)
Which means, sum the columns between the first and the second separators.
-Luke
[-- Attachment #1.2: Type: text/html, Size: 1563 bytes --]
[-- Attachment #2: Type: text/plain, Size: 201 bytes --]
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: making flexible table formulas
2011-02-28 17:35 making flexible table formulas Rustom Mody
2011-02-28 18:14 ` Luke Crook
@ 2011-02-28 18:18 ` Nick Dokos
2011-03-01 9:08 ` Carsten Dominik
2 siblings, 0 replies; 7+ messages in thread
From: Nick Dokos @ 2011-02-28 18:18 UTC (permalink / raw)
To: Rustom Mody; +Cc: nicholas.dokos, emacs-orgmode
Rustom Mody <rustompmody@gmail.com> wrote:
> When using orgmode for hacking on data in a table (org a la spreadsheet) I have this situation
> Say I am concentrating on column 2 and I want the bottom cell to be the sum of the above cells
> For a 7 row table with 8th row having the total I get
>
> #+TBLFM: @8$2=vsum(@1$2..@7$2)
>
> But now I have a problem: If say I add a row to the table then the next time I recompute the formula
> (s) the ninth row is not affected and the 8th row which is now data gets overwritten with a
> computation.
>
> So basically I want the @1 and @7 which are hardcoded above to be replaced by something to the
> effect: "everything above..." and the @8$2 should be something to the tune of "bottom of $2"
>
> I guess this may not be a reasonable request -- but with org you never know :-) so asking if there
> is some way.
>
>
Of course it's reasonable - and of course, org implements it :-)
#+TBLFM: $LR2=vsum(@1..@-1)
In words: column 2 of the last row is the sum of all the rows
(implicitly in column 2) from row 1 to the row above the last one.
See section 3.5.1, "Tables>The spreadsheet>References" for more details.
Nick
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: making flexible table formulas
@ 2011-03-01 3:19 Rustom Mody
2011-03-01 4:41 ` theo
2011-03-01 5:10 ` Nick Dokos
0 siblings, 2 replies; 7+ messages in thread
From: Rustom Mody @ 2011-03-01 3:19 UTC (permalink / raw)
To: emacs-orgmode
Nick Dokos wrote:
> Of course it's reasonable - and of course, org implements it
> #+TBLFM: $LR2=vsum(@1..@-1)
Thanks Nick I can use that. But I dont understand it. What's the -1?
The manual says -- relative to 'current' column.
What determines 'current?' There must be some obvious POV which I am missing...
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: making flexible table formulas
2011-03-01 3:19 Rustom Mody
@ 2011-03-01 4:41 ` theo
2011-03-01 5:10 ` Nick Dokos
1 sibling, 0 replies; 7+ messages in thread
From: theo @ 2011-03-01 4:41 UTC (permalink / raw)
To: emacs-orgmode
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 01/03/2011 04:19, Rustom Mody wrote:
> Nick Dokos wrote:
>
>> Of course it's reasonable - and of course, org implements it
>> #+TBLFM: $LR2=vsum(@1..@-1)
>
> Thanks Nick I can use that. But I dont understand it. What's the -1?
> The manual says -- relative to 'current' column.
> What determines 'current?' There must be some obvious POV which I am missing...
@X = row X, absolute.
@-X = X rows before, relative.
For instance :
I*1 |A--|
1| 1 |
2| 2 |
3| 3 |
I*2 |A--|
4| 6 |
I*3 |A--|
#+TBLFM: $1=vsum(@1..@-1)
Here the 4th row is the sum. So @-1refers to the 3rd row.
If we add a new row before, the sum still works.
I*1 |A---|
1| 1 |
2| 2 |
3| 3 |
4| 42 |
I*2 |A---|
5| 48 |
I*3 |A---|
#+TBLFM: $1=vsum(@1..@-1)
@-1 now refers to the 4 row.
- --
freely yours,
theo
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iQEcBAEBAgAGBQJNbHjoAAoJECkgngj8k9TvPggIAKXvaaz4HfzPOiU2RAajBqYq
/qFYvk5Pf3e1QJme8qiiY0JWiW6isS+YI7bg9Hg6XLe5F3qxm20zz3Z008jWyZuN
TBhsr6ox0B3Hf3OnienQrhUvm8v1bIWiEhJFd/qBG0mp8dY5zeuJro6bLWrZxKhn
zVO0dw7rh3xQoYIOzRIoP1wnykg2xw3st4GH4JqdSusLhAwy/AfkvjgXBf3qbZ/p
FU8ksalYgQUb9S+GGpFdzIyPqJ+d7m3JbAQHbZ0Wpak0oCR306BGIcBuqMqzAZCd
5ukuHJr+Ug4Mlt+OjreAJajeMUVAYTSCU46nupuEJysK4egKEz0LLcNPzoXr7BU=
=o6Qk
-----END PGP SIGNATURE-----
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: making flexible table formulas
2011-03-01 3:19 Rustom Mody
2011-03-01 4:41 ` theo
@ 2011-03-01 5:10 ` Nick Dokos
1 sibling, 0 replies; 7+ messages in thread
From: Nick Dokos @ 2011-03-01 5:10 UTC (permalink / raw)
To: Rustom Mody; +Cc: nicholas.dokos, emacs-orgmode
Rustom Mody <rustompmody@gmail.com> wrote:
> Nick Dokos wrote:
>
> > Of course it's reasonable - and of course, org implements it
> > #+TBLFM: $LR2=vsum(@1..@-1)
>
> Thanks Nick I can use that. But I dont understand it. What's the -1?
> The manual says -- relative to 'current' column.
> What determines 'current?' There must be some obvious POV which I am missing...
>
The formula calculates $LR2: the cell in the last row, column 2.
That's what determines 'current'. Since there is no column spec
on the right-hand side, column 2 is implied. IOW, the formula
is equivalent to this:
#+TBLFM: $LR2=vsum(@1$2..@-1$2)
The vsum on the RHS ranges then from row 1, column 2 (@1$2)
to the row above the last one, still on column 2 (@-1$2).
BTW, if you have a header you should start at row 2 (separator
lines don't count):
| A | B |
|-------+----|
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
| Total | 14 |
#+TBLFM: $LR2=vsum(@2..@-1)
or use the alternative syntax that Luke Crook suggested [fn:1]
#+TBLFM: $LR2=vsum(@I..@-1)
which goes from the first separator (@I) to the penultimate row
(@-1) - and remember that separator lines are ignored in the
calculation.
HTH, [fn:2]
Nick
Footnotes:
[fn:1] Luke suggested the following formula:
#+TBLFM: @8$2=vsum(@I..@II)
with the assumption that there will be two separator lines,
one after the header and one just before the last row,
in effect demarcating the useful part of the table:
| A | B |
|-------+----|
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
|-------+----|
| Total | 14 |
#+TBLFM: $LR2=vsum(@I..@II)
[Luke's LHS fixes the row to 8 which is not correct - I corrected
that in the above formula.]
The only problem with this is if you decide to insert more separators in
the table or you don't want separators at all; but assuming that you can
live with the two (and only those two), it's a good solution.
[fn:2] BTW, you can turn on formula debugging from the Tbl menu or with C-c {
and see what it is calculating: I used a slighty different table - added a few
more rows with S-RET in column 1 and I also had a formula to calculate
the squares in column 2, so the table looked like this:
| a | b |
|-------+---|
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
|-------+---|
| Total | |
#+TBLFM: $LR2=vsum(@2..@-1)::$2 = pow($1, 2)
Then pressing C-c C-c on the #+TBLFM line and saying yes a few times,
you finally get this
| a | b |
|-------+----|
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
| 4 | 16 |
| 5 | 25 |
| 6 | 36 |
|-------+----|
| Total | 91 |
#+TBLFM: $LR2 = vsum(@2..@-1)::$2 = pow($1, 2)
with the following in the formula debugging buffer:
,----
| Substitution history of formula
| Orig: vsum(@2..@-1)
| $xyz-> vsum(@2..@-1)
| @r$c-> vsum([1,4,9,16,25,36])
| $1-> vsum([1,4,9,16,25,36])
| Result: 91
| Format: NONE
| Final: 91
`----
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: making flexible table formulas
2011-02-28 17:35 making flexible table formulas Rustom Mody
2011-02-28 18:14 ` Luke Crook
2011-02-28 18:18 ` Nick Dokos
@ 2011-03-01 9:08 ` Carsten Dominik
2 siblings, 0 replies; 7+ messages in thread
From: Carsten Dominik @ 2011-03-01 9:08 UTC (permalink / raw)
To: Rustom Mody; +Cc: emacs-orgmode
On 28.2.2011, at 18:35, Rustom Mody wrote:
> When using orgmode for hacking on data in a table (org a la spreadsheet) I have this situation
> Say I am concentrating on column 2 and I want the bottom cell to be the sum of the above cells
> For a 7 row table with 8th row having the total I get
>
> #+TBLFM: @8$2=vsum(@1$2..@7$2)
>
> But now I have a problem: If say I add a row to the table then the next time I recompute the formula(s) the ninth row is not affected and the 8th row which is now data gets overwritten with a computation.
Hi Rustom,
in addition to the excellent advice you have already gotten in this thread,
I would like to add the following piece of information (if only to make
the thread a more complete online reference):
Apparently you have been inserting new rows with normal editing commands like
RET or `C-o'. If you use Org's special commands to insert new rows, for example
M-S-<down> on the last row, the row references in the formula will be adjusted
to
@9$2=vsum(@1$2..@7$2)
So you see that the @8 has become a @9. However, the @7 has not been
adjusted because Org has no way of telling what you meant. So even if
you write your formula with @8$2=, you should use relative references to
refer to the fields when summing:
@8$2==vsum(@1$2..@-1$2)
Anyhow, the methods proposed by Nick and Luke are much better in this case.
Hope this helps
- Carsten
>
> So basically I want the @1 and @7 which are hardcoded above to be replaced by something to the effect: "everything above..." and the @8$2 should be something to the tune of "bottom of $2"
>
> I guess this may not be a reasonable request -- but with org you never know :-) so asking if there is some way.
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-03-01 10:24 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-28 17:35 making flexible table formulas Rustom Mody
2011-02-28 18:14 ` Luke Crook
2011-02-28 18:18 ` Nick Dokos
2011-03-01 9:08 ` Carsten Dominik
-- strict thread matches above, loose matches on Subject: below --
2011-03-01 3:19 Rustom Mody
2011-03-01 4:41 ` theo
2011-03-01 5:10 ` Nick Dokos
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).