# [R] subsetting matrix replacement oddities

Spencer Graves spencer.graves at pdf.com
Thu Sep 18 02:41:09 CEST 2003

```A subset of a data.frame is still a data.frame.  A data.frame is
actually a list with additional attributes.  As far as I know, your
solution, "as.matrix", is an appropriate tool to convert a data.frame to
a matrix.  Caution may be appropropriate, however, because if the
data.frame includes anything not numeric, the result may not be numeric,
and the result is inconsistent between S-Plus 6.1 and R 1.7.1.  Consider
the following:

S-PLUS 6.1:

> DF <- data.frame(a = 1:2, b = letters[1:2])
> DF2 <- data.frame(c = TRUE)
> DF3 <- data.frame(c = TRUE, d = 2)
> sapply(DF, class)
a        b
"integer" "factor"
> as.matrix(DF)
a   b
1 "1" "a"
2 "2" "b"
> as.matrix(DF2)
c
1 T
> as.matrix(DF3)
c d
1 1 2

##################
R 1.7.1:

> DF <- data.frame(a=1:2, b=letters[1:2])
> DF2 <- data.frame(c=TRUE)
> DF3 <- data.frame(c=TRUE, d=2)
> sapply(DF, class)
a         b
"integer"  "factor"
> as.matrix(DF)
a   b
1 "1" "a"
2 "2" "b"
> as.matrix(DF2)
c
1 "TRUE"
> as.matrix(DF3)
c      d
1 "TRUE" "2"
#####################
Hope this helps.  spencer graves

Ross Boylan wrote:

>When assigning a dataframe to a subset of a matrix I got a very odd
>result.  Am I missing something, or is this a bug?  Details are below.
>
>Also, if m is defined outside of the current function, is
>m[...] <<- foo
>necessary to update it, or does regular replacement
>m[....] <- foo
>work (that is, does it update the "global" rather than creating a
>"local" that conceals it)?  I got conflicting results, which were
>tangled up with the oddity below.
>--------------------------------------------------------
>
>Browse[1]> covs
>    epilepsy other.cancer
>680        0            0
>681        0            0
>682        0            0
>683        0            1
>684        0            0
>Browse[1]> m <- matrix(NA, 5,2)
>Browse[1]> m[,1:2] <- covs
>Browse[1]> m
>[[1]]
>[1] 0 0 0 0 0
>
>[[2]]
>[1] 0 0 0 1 0
>
>[[3]]
>[1] 0 0 0 0 0
>
>[[4]]
>[1] 0 0 0 1 0
>
>[[5]]
>[1] 0 0 0 0 0
>
>[[6]]
>[1] 0 0 0 1 0
>
>[[7]]
>[1] 0 0 0 0 0
>
>[[8]]
>[1] 0 0 0 1 0
>
>[[9]]
>[1] 0 0 0 0 0
>
>[[10]]
>[1] 0 0 0 1 0
>
>Browse[1]> dim(covs)
>[1] 5 2
>Browse[1]> class(covs)
>[1] "data.frame"
>Browse[1]> class(m)
>[1] "list"
>Browse[1]> length(m)
>[1] 10
>
>Fortunately, the following seems to work as expected:
>Browse[1]> m[,1:2] <- as.matrix(covs)
>
>
>Ross Boylan                                      wk:  (415) 502-4031
>530 Parnassus Avenue (Library) rm 115-4          ross at biostat.ucsf.edu
>Dept of Epidemiology and Biostatistics           fax: (415) 476-9856
>University of California, San Francisco
>San Francisco, CA 94143-0840                     hm:  (415) 550-1062
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://www.stat.math.ethz.ch/mailman/listinfo/r-help
>
>

```