0

当 dimnames 当前NULL为 时,是否可以一次重命名矩阵的维度?

例如,这会失败:

mtx <- matrix(1:16,4)
dimnames(mtx)[[2]][1] <- 'col1'

Error in dimnames(mtx)[[2]][1] <- "col1" : 'dimnames' must be a list

但是,这有效:

mtx <- matrix(1:16,4)
dimnames(mtx)[[1]] <- letters[1:4]
dimnames(mtx)[[2]] <- LETTERS[1:4]
dimnames(mtx)[[2]][1] <- 'col1'
dimnames(mtx)[[2]][2] <- 'col2'

我的目标是单独替换dimnames(mtx)[[2]][1]dimnames(mtx)[[2]][2]......如果这是不可能的,我可以重新编写循环。


谢谢大家,我得到了以下结果——我通过 prepend 传递了名字:

mtxNameSticker <- function(mtx, prepend = NULL, MARGIN=2)
{
    if (MARGIN == 1) max <- nrow(mtx) else
        max  <- ncol(mtx)
    if (is.null(prepend)) if (MARGIN == 2) prepend <- 'C' else
        prepend <- 'R'
    if (length(prepend) == 1) prepend <- paste0(prepend, 1:dim(mtx)[[MARGIN]]) 
    dimnames(mtx)[[MARGIN]] <- seq(from=1, by=1, length.out=dim(mtx)[[MARGIN]]) 
    for (i in 1:max){
        dimnames(mtx)[[MARGIN]][i] <- prepend[i]
    }
    return(mtx)
}
4

4 回答 4

4

只要dimnamesisNULL而不是适当的list,您就不能在特定位置对其进行分配。创建虚拟但完整列表的一种简单方法dimnames是运行:

dimnames(mtx) <- lapply(dim(mtx), seq_len)
mtx
#   1 2  3  4
# 1 1 5  9 13
# 2 2 6 10 14
# 3 3 7 11 15
# 4 4 8 12 16

然后,您可以按照自己的意愿一次分配一项

dimnames(mtx)[[2]][1] <- 'col1'
mtx
#   col1 2  3  4
# 1    1 5  9 13
# 2    2 6 10 14
# 3    3 7 11 15
# 4    4 8 12 16
于 2012-09-14T03:21:47.600 回答
3

即使您被要求提供一个列表,您也正在分配一个向量。

试试这个:

R> M <- matrix(1:4,2,2)
R> M
     [,1] [,2]
[1,]    1    3
[2,]    2    4
R>

列:

R> M1 <- M; dimnames(M1) <- list(NULL, c("a","b")); M1
     a b
[1,] 1 3
[2,] 2 4
R>

行:

R> M2 <- M; dimnames(M2) <- list(c("A","B"), NULL); M2
  [,1] [,2]
A    1    3
B    2    4
R> 
于 2012-09-14T01:58:45.320 回答
2

回应您的评论。@DirkEddelbuettel 是正确的,您正在将向量分配给应该是列表的内容。

这样做的原因是,当暗名NULL(尚未分配)时,您正在分配暗名

R评估以下内容的方式

x <- NULL
x[[2]][1] <- 'col1'
str(x)
##  chr [1:2] NA "col1"

R 返回一个长度为 2 的向量,而不是一个长度为 2 的列表。

为了你的任务工作,R必须评估

x <- NULL
x[[2]][1] <- 'col1'
str(x)

给予

## List of 2
## $ : NULL
## $ : chr "col1"

如果x最初定义为x <- list(NULL,NULL)

但是,dimnames 必须是NULL或适当长度向量的列表

以下确实有效(实际上是@flodel 解决方案)

dimnames(mtx) <- list(character(nrow(mtx)), character(ncol(mtx)))
# or
# dimnames(mtx) <-  lapply(dim(mtx), character) 
dimnames(mtx)[[2]][1] <- 'col1'
于 2012-09-14T03:31:28.383 回答
1

似乎您可以设置维度的名称而实际上没有任何维度名称:

dimnames(mtx) = list(NULL,col1=NULL)
mtx
#      col1
#       [,1] [,2] [,3] [,4]
#  [1,]    1    5    9   13
#  [2,]    2    6   10   14
#  [3,]    3    7   11   15
#  [4,]    4    8   12   16
于 2012-09-14T03:13:14.810 回答