[R] How can I improve an ugly, dumb hack

David Winsemius dwinsemius at comcast.net
Thu Sep 6 20:06:20 CEST 2012


On Sep 6, 2012, at 10:28 AM, Bert Gunter wrote:

> On Thu, Sep 6, 2012 at 10:20 AM, David Winsemius <dwinsemius at comcast.net> wrote:
> <snipped>
> 
>> I guess this means you are not the one performing the d$c <- m step? If you were under control of that step, you can get different (and more to your liking)  behavior with 'cbind.data.frame':
> 
> Correct. d is given to me already, as described. I constructed it in
> my post only to provide an example of what it might look like. I
> apologize for evidently being unclear about this (and I tried real
> hard ... sigh....).
> 

OK, then:

> cbind(d[, !sapply(d, is.matrix)], d[, sapply(d, is.matrix)])
  a b x y
1 1 4 a d
2 2 5 b e
3 3 6 c f

HTH;

--
DW

> '

> -- Bert
> 
> 
>> 
>>> cbind(d, m)
>>  a b x y
>> 1 1 4 a d
>> 2 2 5 b e
>> 3 3 6 c f
>>> ncol( cbind(d, m) )
>> [1] 4
>> 
>> 
>>> 
>>> Now what I wish to do is programmatically convert d to a 4 column
>>> frame with names c("a","b","x","y"). Of course:
>>> 
>>> 1. The column classes/modes must be preserved (character going to
>>> factor and numeric remaining numeric).
>>> 
>>> 2. I assume that I do not know a priori which of d's
>>> components/columns are matrices and which are vectors.
>>> 
>>> 3. There may be many more columns which are vectors or matrix than
>>> just the three in this little example.
>>> 
>>> I can easily and sensibly accomplish these 3 tasks, but the problem is
>>> that I run afoul of data frame column naming procedures in doing so,
>>> about which the data.frame Help page says rather enigmatically:
>>> 
>>> "How the names of the data frame are created is complex, and the rest
>>> of this paragraph is only the basic story." Indeed!
>>> (This, of course, is shorthand for "Go look at the source if you want
>>> to know!" )
>>> 
>>> Anyway, AFAICT from the Help, any "simple" approach to conversion
>>> using data.frame results in "c.x" and "c.y" for the names of the last
>>> two columns. I **can** get what I want by explicitly constructing the
>>> vector of names via the following ugly hack; my question is, can it be
>>> improved?
>>> 
>>>> dd <- do.call(data.frame,d)
>>> 
>>>> dd
>>> a b c.x c.y
>>> 1 1 4   a   d
>>> 2 2 5   b   e
>>> 3 3 6   c   f
>>> 
>>>> ncol(dd)
>>> [1] 4
>>> 
>>>> cnames <- sapply(d,colnames)
>>>> cnames
>>> $a
>>> NULL
>>> 
>>> $b
>>> NULL
>>> 
>>> $c
>>> [1] "x" "y"
>>> 
>>> 
>>>> names(dd) <-  unlist(ifelse(sapply(cnames,is.null),names(d),cnames))
>>> ##Yuck!
>>> 
>>>> dd
>>> a b x y
>>> 1 1 4 a d
>>> 2 2 5 b e
>>> 3 3 6 c f
>>> 
>>> Cheers to all,
>>> Bert
>>> 
>>> 
>>> --
>>> 
>>> Bert Gunter
>>> Genentech Nonclinical Biostatistics
>>> 
>>> Internal Contact Info:
>>> Phone: 467-7374
>>> Website:
>>> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
>>> 
>>> ______________________________________________
>>> 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.
>> 
>> David Winsemius, MD
>> Alameda, CA, USA
>> 
> 
> 
> 
> -- 
> 
> Bert Gunter
> Genentech Nonclinical Biostatistics
> 
> Internal Contact Info:
> Phone: 467-7374
> Website:
> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm

David Winsemius, MD
Alameda, CA, USA




More information about the R-help mailing list