0

現在NULL、dimnames が の場合、マトリックスの次元の名前を一度に 1 つずつ変更できますか?

たとえば、これは失敗します。

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]です...これが不可能な場合は、ループを書き直すことができます。


ありがとう、私は以下のようになりました-私は前に追加して名前を渡します:

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

dimnamesNULL適切でない限りlist、特定の位置に割り当てることはできません。ダミーの完全なリストを作成する簡単な方法の 1 つ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

次に、希望どおりに一度に 1 つずつ割り当てを行うことができます。

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は正しいです。リストであるべきものにベクトルを割り当てています。

これは、dimname がNULL割り当てられていない (まだ割り当てられていない)ときに、dimname を割り当てているためです。

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 に答える