[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
>
>
More information about the R-help
mailing list