Re: [Rd] Quiz: How to get a "named column" from a data frame

From: Duncan Murdoch <murdoch.duncan_at_gmail.com>
Date: Tue, 21 Aug 2012 15:34:13 -0400

On 12-08-18 12:33 PM, Martin Maechler wrote:
>>>>>> Joshua Ulrich <josh.m.ulrich@gmail.com>
>>>>>> on Sat, 18 Aug 2012 10:16:09 -0500 writes:
>
> > I don't know if this is better, but it's the most obvious/shortest I
> > could come up with. Transpose the data.frame column to a 'row' vector
> > and drop the dimensions.
>
> R> identical(nv, drop(t(df)))
> > [1] TRUE
>
> Yes, that's definitely shorter,
> congratulations!
>
> One gotta is that I'd want a solution that also works when the
> df has more columns than just one...
>
> Your idea to use t(.) is nice and "perfect" insofar as it
> coerces the data frame to a matrix, and that's really the clue:
>
> Where as df[,1] is losing the names,
> the matrix indexing is not.
> So your solution can be changed into
>
> t(df)[1,]
>
> which is even shorter...
> and slightly less efficient, at least conceptually, than mine, which has
> been
>
> as.matrix(df)[,1]
>
> Now, the remaining question is: Shouldn't there be something
> more natural to achieve that?
> (There is not, currently, AFAIK).

I've been offline, so I'm a bit late to this game, but the examples above fail when df contains a character column as well as the desired one, because everything gets coerced to a character matrix. You need to select the column first, then convert to a matrix, e.g.

drop(t(df[,1,drop=FALSE]))

Duncan Murdoch

>
> Martin
>
>
> > Best,
> > --
> > Joshua Ulrich | about.me/joshuaulrich
> > FOSS Trading | www.fosstrading.com
>
>
> > On Sat, Aug 18, 2012 at 10:03 AM, Martin Maechler
> > <maechler_at_stat.math.ethz.ch> wrote:
> >> Today, I was looking for an elegant (and efficient) way to get a named
> >> (atomic) vector by selecting one column of a data frame. Of course,
> >> the vector names must be the rownames of the data frame.
> >>
> >> Ok, here is the quiz, I know one quite "cute"/"slick" answer, but was
> >> wondering if there are obvious better ones, and also if this should
> >> not become more idiomatic (hence "R-devel"):
> >>
> >> Consider this toy example, where the dataframe already has only one
> >> column :
> >>
> >>> nv <- c(a=1, d=17, e=101); nv
> >> a d e
> >> 1 17 101
> >>
> >>> df <- as.data.frame(cbind(VAR = nv)); df
> >> VAR
> >> a 1
> >> d 17
> >> e 101
> >>
> >> Now how, can I get 'nv' back from 'df' ? I.e., how to get
> >>
> >>> identical(nv, .......)
> >> [1] TRUE
> >>
> >> where ...... only uses 'df' (and no non-standard R packages)?
> >>
> >> As said, I know a simple solution (*), but I'm sure it is not
> >> obvious to most R users and probably not even to the majority of
> >> R-devel readers... OTOH, people like Bill Dunlap will not take
> >> long to provide it or a better one.
> >>
> >> (*) In my solution, the above '.......' consists of 17 letters.
> >> I'll post it later today (CEST time) ... or confirm
> >> that someone else has done so.
> >>
> >> Martin
> >>
> >> ______________________________________________
> >> R-devel_at_r-project.org mailing list
> >>
https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed 22 Aug 2012 - 13:51:03 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 22 Aug 2012 - 17:40:40 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive