[R] within: order of newly added variables

Duncan Murdoch murdoch at stats.uwo.ca
Wed Sep 2 21:15:44 CEST 2009


On 9/2/2009 1:31 PM, Peter Ehlers wrote:
> Heinrich,
> 
> You could create your own function mywithin()
> by inserting a couple of rev()'s in within.data.frame().
> 
> In within.data.frame(), replace the two commented lines
> with those immediately following:
> 
> mywithin <-
> function (data, expr, ...)
> {
>      parent <- parent.frame()
> #    e <- evalq(environment(), data, parent)
>      e <- evalq(environment(), rev(data), parent)
>      eval(substitute(expr), e)
> #    l <- as.list(e)
>      l <- rev(as.list(e))
>      l <- l[!sapply(l, is.null)]
>      nD <- length(del <- setdiff(names(data), (nl <- names(l))))
>      data[nl] <- l
>      if (nD)
>          data[del] <- if (nD == 1)
>              NULL
>          else vector("list", nD)
>      data
> }

But beware:  some future version of as.list(e) or of the code that 
converts the dataframe to an environment could change the order.  For 
example, if the environment in which those evaluations take place is 
created with new.env(hash=TRUE), the order will be scrambled according 
to the hash function.

Duncan Murdoch

> Peter Ehlers
> 
> RINNER Heinrich wrote:
>> Dear R community,
>> 
>> I am using function 'within' in R.2.9.1 to add variables to an existing data.frame. This works wonderful, except for one minor point: The new variables are added to the data in reverse order.
>> 
>> For example:
>> x <- data.frame(a = 1:3, b = 4:6)
>> y <- within(x, {
>>      c = a^2
>>      d = b^2
>>      e = c+d
>>      }
>> )
>> gives
>>   a b  e  d c
>> 1 1 4 17 16 1
>> 2 2 5 29 25 4
>> 3 3 6 45 36 9
>> 
>> Just what I want; except that I would prefer the columns to be in order a,b,c,d,e instead.
>> 
>> I could use transform ("transform(x, c=a^2, d=b^2, e=c+d)"), which preserves the specified order of variables, but that won't work here because unfortunately it doesn't find object 'd' (same with "within(x, {e = c+d; d = b^2; c = a^2})", by the way).
>> 
>> Of course in my toy example I can easily do something like y[, c(1:2,5:3)] afterwards, but I'd like to ask if maybe there is a simple way to make 'within' preserve the order of specified variables (or maybe someone can shed light on why this is not possible?).
>> 
>> Thanks,
>> Heinrich.
>> 
>> ______________________________________________
>> R-help at 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.
>> 
>>
> 
> ______________________________________________
> R-help at 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.




More information about the R-help mailing list