[R] Use of parantheses to force order of execution

2013-09-08 Thread Ben Harrison
Hello,
I wish to create a copy of a data frame, but with missing values replaced
with NAs.

I thought I should be able to do it in one step using parentheses to group
the statements and force those inside the parens to execute first:

df - (BWS6[BWS6  -998] - NA)

But all this does is assign NA to df, as described in ?[ for the case
with no parens.

Can I do this in some way? It's no great problem of course to have two
separate statements, just curious.

Ben.

[[alternative HTML version deleted]]

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Use of parantheses to force order of execution

2013-09-08 Thread Duncan Murdoch

On 13-09-08 6:46 AM, Ben Harrison wrote:

Hello,
I wish to create a copy of a data frame, but with missing values replaced
with NAs.

I thought I should be able to do it in one step using parentheses to group
the statements and force those inside the parens to execute first:

df - (BWS6[BWS6  -998] - NA)

But all this does is assign NA to df, as described in ?[ for the case
with no parens.

Can I do this in some way? It's no great problem of course to have two
separate statements, just curious.


This isn't an order of execution issue.  Your parenthesized assignment 
modifies BWS6, and that's not what you want to do.


If you convert BWS6 to a matrix instead of a dataframe, you could use

res - ifelse(BWS6  -998, NA, BWS6)

but ifelse doesn't work on dataframes in general.  You can do it in one 
long line with a dataframe using lapply, but it is ugly:


df - as.data.frame( lapply(BWS6, function(col) ifelse(col  -998, NA, 
col)))


Duncan Murdoch

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Use of parantheses to force order of execution

2013-09-08 Thread peter dalgaard

On Sep 8, 2013, at 16:09 , Duncan Murdoch wrote:

 On 13-09-08 6:46 AM, Ben Harrison wrote:
 Hello,
 I wish to create a copy of a data frame, but with missing values replaced
 with NAs.
 
 I thought I should be able to do it in one step using parentheses to group
 the statements and force those inside the parens to execute first:
 
 df - (BWS6[BWS6  -998] - NA)
 
 But all this does is assign NA to df, as described in ?[ for the case
 with no parens.
 
 Can I do this in some way? It's no great problem of course to have two
 separate statements, just curious.
 
 This isn't an order of execution issue.  Your parenthesized assignment 
 modifies BWS6, and that's not what you want to do.

Also, the value of an assignment is always the right hand side, in this case NA.

The canonical way would be --- but There be Tygers There! --- this: 

df - `[-`(BWS6, BWS6  -998, NA)

The Tygers are that R sometimes cheats in order to avoid duplication and 
assumes that `[-` can destructively modify its argument. So you shouldn't 
actually do the above.

- Peter D. 

 
 If you convert BWS6 to a matrix instead of a dataframe, you could use
 
 res - ifelse(BWS6  -998, NA, BWS6)
 
 but ifelse doesn't work on dataframes in general.  You can do it in one long 
 line with a dataframe using lapply, but it is ugly:
 
 df - as.data.frame( lapply(BWS6, function(col) ifelse(col  -998, NA, col)))
 
 Duncan Murdoch
 
 __
 R-help@r-project.org mailing list
 https://stat.ethz.ch/mailman/listinfo/r-help
 PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
 and provide commented, minimal, self-contained, reproducible code.

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd@cbs.dk  Priv: pda...@gmail.com

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Use of parantheses to force order of execution

2013-09-08 Thread Ben Harrison
Thank you all for the replies.

BWS6 is a data frame, but actually the main problem in my code as Duncan
points out is that the statement inside the parentheses modifies BWS6
anyway. I need to rework my code.

I coded my missing values for these data sets as -999.25 (a hangover from
another piece of software that dumps out results). It's a rather dangerous
thing to do, as in some cases I have discovered that when I write to csv,
-999.25 is written as -999.2 or even -999 in some cases (haven't completely
worked that out). Hence the awkward  998 expression.


In respect of Duncan and Peter's solutions, I have found that R can be a
troublesome pet at times, and this seems like one of them.
Thanks for the help and warnings!

Ben.


On 9 September 2013 00:39, peter dalgaard pda...@gmail.com wrote:


 On Sep 8, 2013, at 16:09 , Duncan Murdoch wrote:

  On 13-09-08 6:46 AM, Ben Harrison wrote:
  Hello,
  I wish to create a copy of a data frame, but with missing values
 replaced
  with NAs.
 
  I thought I should be able to do it in one step using parentheses to
 group
  the statements and force those inside the parens to execute first:
 
  df - (BWS6[BWS6  -998] - NA)
 
  But all this does is assign NA to df, as described in ?[ for the case
  with no parens.
 
  Can I do this in some way? It's no great problem of course to have two
  separate statements, just curious.
 
  This isn't an order of execution issue.  Your parenthesized assignment
 modifies BWS6, and that's not what you want to do.

 Also, the value of an assignment is always the right hand side, in this
 case NA.

 The canonical way would be --- but There be Tygers There! --- this:

 df - `[-`(BWS6, BWS6  -998, NA)

 The Tygers are that R sometimes cheats in order to avoid duplication and
 assumes that `[-` can destructively modify its argument. So you shouldn't
 actually do the above.

 - Peter D.

 
  If you convert BWS6 to a matrix instead of a dataframe, you could use
 
  res - ifelse(BWS6  -998, NA, BWS6)
 
  but ifelse doesn't work on dataframes in general.  You can do it in one
 long line with a dataframe using lapply, but it is ugly:
 
  df - as.data.frame( lapply(BWS6, function(col) ifelse(col  -998, NA,
 col)))
 
  Duncan Murdoch
 
  __
  R-help@r-project.org mailing list
  https://stat.ethz.ch/mailman/listinfo/r-help
  PLEASE do read the posting guide
 http://www.R-project.org/posting-guide.html
  and provide commented, minimal, self-contained, reproducible code.

 --
 Peter Dalgaard, Professor,
 Center for Statistics, Copenhagen Business School
 Solbjerg Plads 3, 2000 Frederiksberg, Denmark
 Phone: (+45)38153501
 Email: pd@cbs.dk  Priv: pda...@gmail.com










[[alternative HTML version deleted]]

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.