2012-09-14 51 views
0

當dimnames當前是NULL時,是否可以每次更改一個矩陣的維數?當dimname爲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' 

我的目標是seperately取代dimnames(mtx)[[2]][1]dimnames(mtx)[[2]][2]等......如果這是不可能,我可以重新編寫循環。


感謝鄉親,我已經結束了與以下 - 我通過預先準備通過姓名:

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

因爲只要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 
+0

+1 /接受。非常感謝。我想要單獨的尺寸,所以我要去:'dimnames(mtx)[[i]] < - seq(from = 1,by = 1,length.out = dim(mtx)[[i ]])'。 – ricardo

+0

@ricardo您還可以使用'seq_along(dim(mtx)[[i]])'而不是'seq(from = 1,by = 1,length.out = dim(mtx)[[i]])''。 –

+0

謝謝。我認爲這隻會返回數字'1' – ricardo

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> 
+0

由於這是有道理的。我想我在我的問題上是模糊的 - 我意識到可以分別替換'dimnames(M2)[[1]]和'dimnames(M2)[[2]]'。一次一個,我的意思是我可以在dimnames(M2)[[2]和[dimnames(M2)[[2]] [1]'和dimnames(M2)[[2]] [2] ]] == NULL'。 – ricardo

1

看來你被允許設置名稱的尺寸而實際上不必任何名稱for尺寸:

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 
2

迴應你的評論。 @DirkEddelbuettel是正確的,你正在爲應該是一個列表分配一個向量。

這樣做的原因是,你是當dimnames是NULL(尚未分配)分配dimnames

ř評估以下

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)

但是,會發生什麼暗號必須是NULL或適當長度向量的列表

以下確實工作(和真的@flodel溶液)

dimnames(mtx) <- list(character(nrow(mtx)), character(ncol(mtx))) 
# or 
# dimnames(mtx) <- lapply(dim(mtx), character) 
dimnames(mtx)[[2]][1] <- 'col1' 
+0

+1。好的謝謝。底線是flodel的整齊入侵是唯一的解決方案? – ricardo