emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Dan Davison <davison@stats.ox.ac.uk>
To: "Sébastien Vauban"
	<public-wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@plane.gmane.org>
Cc: public-emacs-orgmode-mXXj517/zsQ@plane.gmane.org
Subject: Re: [Org-Babel] and R... non-numeric cells
Date: Thu, 12 Aug 2010 16:27:17 -0400	[thread overview]
Message-ID: <874oezr2ze.fsf@stats.ox.ac.uk> (raw)
In-Reply-To: <871va3hnvj.fsf@mundaneum.com> ("Sébastien Vauban"'s message of "Thu, 12 Aug 2010 17:06:08 +0200")



Sébastien Vauban <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org>
writes:

> Hello,
>
> For a report I'm writing, I've been helped by a colleague of mine (let's call
> him Albert) for the R graphics generation.
>
> Here's an extract of my doc:
>
> #+TBLNAME: investissement-2010-2013
> #+ATTR_LaTeX: align=lSSSS
> |                        | \s{Année 2010} | \s{Année 2011} | \s{Année 2012} | \s{Année 2013} |
> |------------------------+----------------+----------------+----------------+----------------|
> | RFO                    |     2596376.30 |     1500000.00 |      500000.00 |      500000.00 |
> | RFO réseau structurant |     3804467.00 |     6534066.00 |     3804467.00 |           0.00 |
> | Équipements            |     1000000.00 |      150000.00 |       50000.00 |       50000.00 |
> |------------------------+----------------+----------------+----------------+----------------|
> | Total (HTVA)           |     7400843.30 |     8184066.00 |     4354467.00 |      550000.00 |
> #+TBLFM: @5$2=vsum(@-I..@-II);%.2f::@5$3=vsum(@-I..@-II);%.2f::@5$4=vsum(@-I..@-II);%.2f::@5$5=vsum(@-I..@-II);%.2f
>
> whose graphical representation is:
>
> #+srcname: barplot-investment(ptable = investissement-2010-2013)
> #+begin_src R :file 1-01-investissement-2010-2013.png :exports none :session
> source("mcplot.R", local=TRUE)
> ## select the last row only, exclude first column, scale: unit = 1M
> alldata <- as.matrix(ptable[2:4, -1]) / 1000000
> axisLabels <- c("Année", "Montant HTVA (M€)")
> mcStackedBarplot(alldata, "Investissements", c(2010:2013), ptable[-nrow(ptable),1], legend.location="topright")
> #+end_src
>
> That works perfectly for him (on Ubuntu 9.04, R 2.7.1, Emacs 22.2.1, Org 6.35)
>
> Not for me... on Ubuntu 10.04, R 2.10.1, Emacs 23.1.1, Org 7.01, ESS 5.10: I
> get the message
>
>     *Error in as.matrix(ptable[2:4, -1])/1e+06 :
>      non-numeric argument to binary operator*

Hi Seb,

The problem is that Org has not automatically recognised that you want
the first row to be treated as column names. The reason is that your
table contains multiple horizontal separator lines. So for this table,
you must use ':colnames yes' to tell Org that your first row contains
column names. See sections 14.8.2.12, 14.8.2.13 and 14.8.2.14 in the
manual.

As Erik pointed out, using str is a very good way to investigate your
data structures. Notice below that your column names have become the
first row of the data frame, and as a consequence the columns of the
data frame have been force to character rather than numeric:

--8<---------------cut here---------------start------------->8---
#+srcname: barplot-investment(ptable = investissement-2010-2013)
#+begin_src R :XXX-file 1-01-investissement-2010-2013.png :exports none :session :results output
str(ptable)
#+end_src

#+results: barplot-investment
: 
: 'data.frame':	5 obs. of  5 variables:
:  $ V1: chr  "" "RFO" "RFO réseau structurant" "Équipements" ...
:  $ V2: chr  "\\s{Année 2010}" "2596376.3" "3804467.0" "1000000.0" ...
:  $ V3: chr  "\\s{Année 2011}" "1500000.0" "6534066.0" "150000.0" ...
:  $ V4: chr  "\\s{Année 2012}" "500000.0" "3804467.0" "50000.0" ...
:  $ V5: chr  "\\s{Année 2013}" "500000.0" "0.0" "50000.0" ...
--8<---------------cut here---------------end--------------->8---


However, if we use :colnames yes then we have

--8<---------------cut here---------------start------------->8---
#+srcname: barplot-investment(ptable = investissement-2010-2013)
#+begin_src R :XXX-file 1-01-investissement-2010-2013.png :exports none :session :results output :colnames yes
str(ptable)
#+end_src

#+results: barplot-investment
: 
: 'data.frame':	4 obs. of  5 variables:
:  $ X              : chr  "RFO" "RFO réseau structurant" "Équipements" "Total (HTVA)"
:  $ X.s.Année.2010.: num  2596376 3804467 1000000 7400843
:  $ X.s.Année.2011.: num  1500000 6534066 150000 8184066
:  $ X.s.Année.2012.: num  500000 3804467 50000 4354467
:  $ X.s.Année.2013.: num  500000 0 50000 550000
--8<---------------cut here---------------end--------------->8---


And in this case you probably want ':rownames yes', which will mean you
no longer need the -1 in the indexing expression in your R code.

--8<---------------cut here---------------start------------->8---
#+srcname: barplot-investment(ptable = investissement-2010-2013)
#+begin_src R :XXX-file 1-01-investissement-2010-2013.png :exports none :session :results output :colnames yes :rownames yes
str(ptable)
options(width=100)
head(ptable)
#+end_src

#+results: barplot-investment
#+begin_example

'data.frame':	4 obs. of  4 variables:
 $ X.s.Année.2010.: num  2596376 3804467 1000000 7400843
 $ X.s.Année.2011.: num  1500000 6534066 150000 8184066
 $ X.s.Année.2012.: num  500000 3804467 50000 4354467
 $ X.s.Année.2013.: num  500000 0 50000 550000
                       X.s.Année.2010. X.s.Année.2011. X.s.Année.2012. X.s.Année.2013.
RFO                            2596376         1500000          500000          500000
RFO réseau structurant         3804467         6534066         3804467               0
Équipements                    1000000          150000           50000           50000
Total (HTVA)                   7400843         8184066         4354467          550000
#+end_example
--8<---------------cut here---------------end--------------->8---


Dan

> As 1M is numeric, the non-numeric operand must be
> =as.matrix(ptable[2:4, -1])=... Verification:
>
>> ptable
>                       V1              V2              V3              V4
> 1                        \\s{Année 2010} \\s{Année 2011} \\s{Année 2012}
> 2                    RFO       2596376.3       1500000.0        500000.0
> 3 RFO réseau structurant       3804467.0       6534066.0       3804467.0
> 4            Équipements       1000000.0        150000.0         50000.0
> 5           Total (HTVA)       7400843.3       8184066.0       4354467.0
>                V5
> 1 \\s{Année 2013}
> 2        500000.0
> 3             0.0
> 4         50000.0
> 5        550000.0
>
>> as.matrix(ptable[2:4, -1])
>   V2          V3          V4          V5        
> 2 "2596376.3" "1500000.0" "500000.0"  "500000.0"
> 3 "3804467.0" "6534066.0" "3804467.0" "0.0"     
> 4 "1000000.0" "150000.0"  "50000.0"   "50000.0" 
>
> The numerics are written between double quotes... Why!?
>
> I had temporarily patched the above problem in my document by updating the line
> with the assignment:
>
> #+srcname: barplot-investment-sva(ptable = investissement-2010-2013)
> #+begin_src R :file 1-01-investissement-sva-2010-2013.png :exports none :session
> source("mcplot.R", local=TRUE)
> ## select the last row only, exclude first column, scale: unit = 1M
> alldata <- matrix(as.numeric(as.matrix(ptable[2:4, -1])), nrow=3, ncol=4) / 1000000
> axisLabels <- c("Année", "Montant HTVA (M€)")
> mcStackedBarplot(alldata, "Investissements", c(2010:2013), ptable[2:4,1], legend.location="topright")
> #+end_src
>
> and I even just noticed that, instead of complexifying the expression, I can
> simplify it, in my case, as my =ptable= is numeric already:
>
>> ptable[2:4, -1]
>          V2        V3        V4       V5
> 2 2596376.3 1500000.0  500000.0 500000.0
> 3 3804467.0 6534066.0 3804467.0      0.0
> 4 1000000.0  150000.0   50000.0  50000.0
>
> But I still don't understand what is reponsible of a different treatment of
> string and numerics between our 2 machines.
>
> Any idea?
>
> Best regards,
>   Seb

  parent reply	other threads:[~2010-08-12 20:27 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-12 15:06 [Org-Babel] and R... non-numeric cells Sébastien Vauban
2010-08-12 15:20 ` Erik Iverson
2010-08-12 15:30 ` Neil Hepburn
2010-08-12 15:57   ` Erik Iverson
2010-08-12 20:27 ` Dan Davison [this message]
2010-08-18  7:15   ` Sébastien Vauban

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=874oezr2ze.fsf@stats.ox.ac.uk \
    --to=davison@stats.ox.ac.uk \
    --cc=public-emacs-orgmode-mXXj517/zsQ@plane.gmane.org \
    --cc=public-wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@plane.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).