[Rd] (PR#13705) [wishlist, patch] make row() and col() preserve dimnames
Prof Brian Ripley
ripley at stats.ox.ac.uk
Mon May 25 14:32:23 CEST 2009
On Sun, 17 May 2009, goodrich at fas.harvard.edu wrote:
> Full_Name: Ben Goodrich
> Version: 2.9.0
> OS: Linux (Debian unstable)
> Submission from: (NULL) (128.103.220.16)
>
>
> row(x), col(x), and functions that call them like lower.tri(x) and
> upper.tri(x) do not retain the rownames or colnames of x in the
> matrix that is returned. Example from R version 2.9.0 :
>
> x <- matrix(1:9, nrow = 3, ncol = 3)
> rownames(x) <- LETTERS[1:3]
> colnames(x) <- letters[1:3]
>
> dimnames(row(x)) # NULL
> dimnames(col(x)) # NULL
>
> Is there anyone for whom the expected behavior is to drop the
> dimnames of x ? It is not consistent with other functions of
> matrices.
I suspect everyone who reads the help page carefully.
This is not a 'function of a matrix' x but of dim(x) for a
'matrix-like' object. The help page makes this clear to me (I am not
the author), so I think you have misread it. There is no question of
'drop the dimames' nor 'retaining the rownames': it is a new object,
an integer matrix whatever x was.
These functions are mainly for use in programming, and need to be
efficient -- so adding dimnames that will never be needed by all the
existing code is a non-trivial overhead.
> By default, row(x) already
> returns the row numbers of x (and similarly for col()), so how would seeing
> integers in the rownames be helpful?
>
> Without patch:
>> row(x)
> [,1] [,2] [,3]
> [1,] 1 1 1
> [2,] 2 2 2
> [3,] 3 3 3
>
> With patch:
>> row(x)
> a b c
> A 1 1 1
> B 2 2 2
> C 3 3 3
>
> Patch:
> Index: src/library/base/R/matrix.R
> ===================================================================
> --- src/library/base/R/matrix.R (revision 48553)
> +++ src/library/base/R/matrix.R (working copy)
> @@ -104,8 +104,9 @@
> labs <- rownames(x, do.NULL=FALSE, prefix="")
> res <- factor(.Internal(row(dim(x))), labels=labs)
> dim(res) <- dim(x)
> - res
> - } else .Internal(row(dim(x)))
> + } else res <- .Internal(row(dim(x)))
> + dimnames(res) <- dimnames(x)
> + res
> }
Lots of issues here: dimnames() is generic and may not be compatible
with the object produced, so checks are needed. And for efficiency
this should be done in the C-level code that creates the object if
done at all.
> col <- function(x, as.factor=FALSE)
> @@ -114,8 +115,9 @@
> labs <- colnames(x, do.NULL=FALSE, prefix="")
> res <- factor(.Internal(col(dim(x))), labels=labs)
> dim(res) <- dim(x)
> - res
> - } else .Internal(col(dim(x)))
> + } else res <- .Internal(col(dim(x)))
> + dimnames(res) <- dimnames(x)
> + res
> }
>
> crossprod <- function(x, y=NULL) .Internal(crossprod(x,y))
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
--
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
More information about the R-devel
mailing list