Grokbase Groups R r-help April 2005
FAQ

[R] factor to numeric in data.frame

Heinz Tuechler
Apr 2, 2005 at 11:01 am
Dear All,

Assume I have a data.frame that contains also factors and I would like to
get another data.frame containing the factors as numeric vectors, to apply
functions like sapply(..., median) on them.
I read the warning concerning as.numeric or unclass, but in my case this
makes sense, because the factor levels are properly ordered.
I can do it, if I write for each single column "unclass(...), but I would
like to use indexing, e.g. unclass(df[1:10]).
Is that possible?

Thanks,
Heinz T?chler

## Example:
f1 <- factor(c(rep('c1-low',2),rep('c2-med',5),rep('c3-high',3)))
f2 <- factor(c(rep('c1-low',5),rep('c2-low',3),rep('c3-low',2)))
df.f12 <- data.frame(f1,f2) # data.frame containing factors

## this does work
df.f12.num <- data.frame(unclass(df.f12[[1]]),unclass(df.f12[[2]]))
df.f12.num
## this does not work
df.f12.num <- data.frame(unclass(df.f12[[1:2]]))
df.f12.num
## this does not work
df.f12.num <- data.frame(unclass(df.f12[1:2]))
df.f12.num
reply

Search Discussions

4 responses

  • Gabor Grothendieck at Apr 2, 2005 at 12:15 pm
    Try this:

    data.matrix(df.f12)
    On Apr 2, 2005 6:01 AM, Heinz Tuechler wrote:
    Dear All,

    Assume I have a data.frame that contains also factors and I would like to
    get another data.frame containing the factors as numeric vectors, to apply
    functions like sapply(..., median) on them.
    I read the warning concerning as.numeric or unclass, but in my case this
    makes sense, because the factor levels are properly ordered.
    I can do it, if I write for each single column "unclass(...), but I would
    like to use indexing, e.g. unclass(df[1:10]).
    Is that possible?

    Thanks,
    Heinz T?chler

    ## Example:
    f1 <- factor(c(rep('c1-low',2),rep('c2-med',5),rep('c3-high',3)))
    f2 <- factor(c(rep('c1-low',5),rep('c2-low',3),rep('c3-low',2)))
    df.f12 <- data.frame(f1,f2) # data.frame containing factors

    ## this does work
    df.f12.num <- data.frame(unclass(df.f12[[1]]),unclass(df.f12[[2]]))
    df.f12.num
    ## this does not work
    df.f12.num <- data.frame(unclass(df.f12[[1:2]]))
    df.f12.num
    ## this does not work
    df.f12.num <- data.frame(unclass(df.f12[1:2]))
    df.f12.num

    ______________________________________________
    R-help at stat.math.ethz.ch mailing list
    https://stat.ethz.ch/mailman/listinfo/r-help
    PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
  • Heinz Tuechler at Apr 2, 2005 at 12:31 pm

    At 07:15 02.04.2005 -0500, Gabor Grothendieck wrote:
    Try this:

    data.matrix(df.f12)
    Perfect! This is exactly what I needed.

    Many thanks,
    Heinz T?chler
    On Apr 2, 2005 6:01 AM, Heinz Tuechler wrote:
    Dear All,

    Assume I have a data.frame that contains also factors and I would like to
    get another data.frame containing the factors as numeric vectors, to apply
    functions like sapply(..., median) on them.
    I read the warning concerning as.numeric or unclass, but in my case this
    makes sense, because the factor levels are properly ordered.
    I can do it, if I write for each single column "unclass(...), but I would
    like to use indexing, e.g. unclass(df[1:10]).
    Is that possible?

    Thanks,
    Heinz T?chler

    ## Example:
    f1 <- factor(c(rep('c1-low',2),rep('c2-med',5),rep('c3-high',3)))
    f2 <- factor(c(rep('c1-low',5),rep('c2-low',3),rep('c3-low',2)))
    df.f12 <- data.frame(f1,f2) # data.frame containing factors

    ## this does work
    df.f12.num <- data.frame(unclass(df.f12[[1]]),unclass(df.f12[[2]]))
    df.f12.num
    ## this does not work
    df.f12.num <- data.frame(unclass(df.f12[[1:2]]))
    df.f12.num
    ## this does not work
    df.f12.num <- data.frame(unclass(df.f12[1:2]))
    df.f12.num

    ______________________________________________
    R-help at stat.math.ethz.ch mailing list
    https://stat.ethz.ch/mailman/listinfo/r-help
    PLEASE do read the posting guide!
    http://www.R-project.org/posting-guide.html
  • Prof Brian Ripley at Apr 2, 2005 at 1:26 pm

    On Sat, 2 Apr 2005, Heinz Tuechler wrote:

    Dear All,

    Assume I have a data.frame that contains also factors and I would like to
    get another data.frame containing the factors as numeric vectors, to apply
    functions like sapply(..., median) on them.
    I read the warning concerning as.numeric or unclass, but in my case this
    makes sense, because the factor levels are properly ordered.
    I can do it, if I write for each single column "unclass(...), but I would
    like to use indexing, e.g. unclass(df[1:10]).
    Is that possible?
    Yes: unclass is applied to a column and not the data frame.

    newdf <- df
    newdf[1:10] <- lapply(newdf[1:10], unclass)

    BTW, please read the posting guide, and do not say `does not work' when it
    patently does work as documented.
    Thanks,
    Heinz T?chler

    ## Example:
    f1 <- factor(c(rep('c1-low',2),rep('c2-med',5),rep('c3-high',3)))
    f2 <- factor(c(rep('c1-low',5),rep('c2-low',3),rep('c3-low',2)))
    df.f12 <- data.frame(f1,f2) # data.frame containing factors

    ## this does work
    df.f12.num <- data.frame(unclass(df.f12[[1]]),unclass(df.f12[[2]]))
    df.f12.num
    ## this does not work
    df.f12.num <- data.frame(unclass(df.f12[[1:2]]))
    Yes, it does work. What do you think [[1:2]] does? Please RTFM.
    ## this does not work
    df.f12.num <- data.frame(unclass(df.f12[1:2]))
    df.f12.num
    That also works: unclassing a data frame gives a list.

    --
    Brian D. Ripley, ripley at stats.ox.ac.uk
    Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
    University of Oxford, Tel: +44 1865 272861 (self)
    1 South Parks Road, +44 1865 272866 (PA)
    Oxford OX1 3TG, UK Fax: +44 1865 272595
  • Heinz Tuechler at Apr 2, 2005 at 12:43 pm

    At 14:26 02.04.2005 +0100, Prof Brian Ripley wrote:
    On Sat, 2 Apr 2005, Heinz Tuechler wrote:

    Dear All,

    Assume I have a data.frame that contains also factors and I would like to
    get another data.frame containing the factors as numeric vectors, to apply
    functions like sapply(..., median) on them.
    I read the warning concerning as.numeric or unclass, but in my case this
    makes sense, because the factor levels are properly ordered.
    I can do it, if I write for each single column "unclass(...), but I would
    like to use indexing, e.g. unclass(df[1:10]).
    Is that possible?
    Yes: unclass is applied to a column and not the data frame.

    newdf <- df
    newdf[1:10] <- lapply(newdf[1:10], unclass)

    BTW, please read the posting guide, and do not say `does not work' when it
    patently does work as documented.
    Thank you for your answer. I am sorry for the unprecise formulation `does
    not work'. I intended `does not solve my problem'.
    In the meantime Gabor Grothendieck responded with:
    'Try this: data.matrix(df.f12)'
    which is exactly, what I was searching for.

    Many thanks,
    Heinz T?chler

    Thanks,
    Heinz T?chler

    ## Example:
    f1 <- factor(c(rep('c1-low',2),rep('c2-med',5),rep('c3-high',3)))
    f2 <- factor(c(rep('c1-low',5),rep('c2-low',3),rep('c3-low',2)))
    df.f12 <- data.frame(f1,f2) # data.frame containing factors

    ## this does work
    df.f12.num <- data.frame(unclass(df.f12[[1]]),unclass(df.f12[[2]]))
    df.f12.num
    ## this does not work
    df.f12.num <- data.frame(unclass(df.f12[[1:2]]))
    Yes, it does work. What do you think [[1:2]] does? Please RTFM.
    ## this does not work
    df.f12.num <- data.frame(unclass(df.f12[1:2]))
    df.f12.num
    That also works: unclassing a data frame gives a list.

    --
    Brian D. Ripley, ripley at stats.ox.ac.uk
    Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
    University of Oxford, Tel: +44 1865 272861 (self)
    1 South Parks Road, +44 1865 272866 (PA)
    Oxford OX1 3TG, UK Fax: +44 1865 272595

Related Discussions

Discussion Navigation
viewthread | post