当dimname为NULL时,一次命名一个矩阵维度的元素

时间:2012-09-14 01:54:33

标签: r

当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]等......如果不可能,我可以重新编写循环。


谢谢大家,我最终得到了以下内容 - 我在via 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 个答案:

答案 0 :(得分:4)

只要dimnamesNULL而不是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

答案 1 :(得分: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> 

答案 2 :(得分:2)

回应你的评论。 @DirkEddelbuettel是正确的,你正在为一个列表分配一个向量。

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

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'

答案 3 :(得分: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