当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)
}
答案 0 :(得分:4)
只要dimnames
为NULL
而不是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