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

Martin Maechler maechler at stat.math.ethz.ch
Sat Aug 18 18:33:36 CEST 2012

>>>>> Joshua Ulrich <josh.m.ulrich at 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,

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


which is even shorter...
and slightly less efficient, at least conceptually, than mine, which has


Now, the remaining question is:  Shouldn't there be something
more natural to achieve that?
(There is not, currently, AFAIK).


    > 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

More information about the R-devel mailing list