[R] How can I improve an ugly, dumb hack
Eik Vettorazzi
E.Vettorazzi at uke.de
Thu Sep 6 18:52:45 CEST 2012
Hi Bert,
maybe I'm missing the point, but
dd<-cbind(d,m)
does 1, 2 and 3 as desired:
n <- data.frame(nx=letters[7:9], ny = 7:9)
str(cbind(d,m,n))
t<-letters[7:9]
str(cbind(d,t))
cheers.
Am 06.09.2012 18:03, schrieb Bert Gunter:
> Hi Folks:
>
> Here's the situation:
>
>> m <- cbind(x=letters[1:3], y = letters[4:6])
>> m
> x y
> [1,] "a" "d"
> [2,] "b" "e"
> [3,] "c" "f"
>
> ## m is a 2 column character matrix
>
>> d <- data.frame(a=1:3,b=4:6)
>> d$c <- m
>> d
> a b c.x c.y
> 1 1 4 a d
> 2 2 5 b e
> 3 3 6 c f
>
> ## But please note (as was remarked in a thread here a couple of months ago)
>> ncol(d)
> [1] 3
>
> ## d is a ** 3 ** column data frame
>
> 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
>
>
--
Eik Vettorazzi
Department of Medical Biometry and Epidemiology
University Medical Center Hamburg-Eppendorf
Martinistr. 52
20246 Hamburg
T ++49/40/7410-58243
F ++49/40/7410-57790
--
Pflichtangaben gemäß Gesetz über elektronische Handelsregister und Genossenschaftsregister sowie das Unternehmensregister (EHUG):
Universitätsklinikum Hamburg-Eppendorf; Körperschaft des öffentlichen Rechts; Gerichtsstand: Hamburg
Vorstandsmitglieder: Prof. Dr. Guido Sauter (Vertreter des Vorsitzenden), Dr. Alexander Kirstein, Joachim Prölß, Prof. Dr. Dr. Uwe Koch-Gromus
More information about the R-help
mailing list