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

Rui Barradas ruipbarradas at sapo.pt
Thu Sep 6 20:02:02 CEST 2012


Hello,

Try the following.

class(d[3][[1]])
dim(d[3][[1]])

(d2 <- cbind(d[1:2], d[3][[1]]))
dim(d2)

Funny how the original names of 'm' are retrieved.

Rui Barradas

Em 06-09-2012 18:28, Bert Gunter escreveu:
> 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....).
>
> -- 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
>>
>
>




More information about the R-help mailing list