【问题标题】:Changing names on a matrix within array fails在数组内的矩阵上更改名称失败
【发布时间】:2021-07-21 01:06:52
【问题描述】:

我正在制作一些基本 R 使用的练习和演示文稿。前段时间,为了使用子集和访问对象中的不同元素,我制作了一个练习,即“尝试更改数组 X 中矩阵 1 的行和列的名称”。这是数组:

, , 1

     [,1] [,2] [,3] [,4] [,5]
[1,]  0.5  0.5  0.5  0.5  0.5
[2,]  0.5  0.5  0.5  0.5  0.5
[3,]  0.5  0.5  0.5  0.5  0.5
[4,]  0.5  0.5  0.5  0.5  0.5
[5,]  0.5  0.5  0.5  0.5  0.5

, , 2

     [,1] [,2] [,3] [,4] [,5]
[1,]  4.5  4.5  4.5  4.5  4.5
[2,]  4.5  4.5  4.5  4.5  4.5
[3,]  4.5  4.5  4.5  4.5  4.5
[4,]  4.5  4.5  4.5  4.5  4.5
[5,]  4.5  4.5  4.5  4.5  4.5

当时对我有用的解决方案是:

colnames(ArrayX[,, 1]) <- c(paste("coordX", 1:5, sep = ""))
rownames(ArrayX[,, 1]) <- c(paste("coordY", 1:5, sep = ""))

但是,现在,即使运行时没有返回错误,数组仍然保持不变......

这是会话信息:

R version 4.0.4 (2021-02-15)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

locale:
[1] LC_COLLATE=Spanish_Spain.1252  LC_CTYPE=Spanish_Spain.1252    LC_MONETARY=Spanish_Spain.1252 LC_NUMERIC=C                  
[5] LC_TIME=Spanish_Spain.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] RODBC_1.3-17    knitr_1.31      readxl_1.3.1    reshape2_1.4.4  forcats_0.5.1   stringr_1.4.0   dplyr_1.0.5     purrr_0.3.4    
 [9] readr_1.4.0     tidyr_1.1.3     tibble_3.1.0    ggplot2_3.3.3   tidyverse_1.3.0

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.6       plyr_1.8.6       cellranger_1.1.0 pillar_1.5.1     compiler_4.0.4   dbplyr_2.1.0     tools_4.0.4     
 [8] jsonlite_1.7.2   lubridate_1.7.10 lifecycle_1.0.0  gtable_0.3.0     pkgconfig_2.0.3  rlang_0.4.10     reprex_1.0.0    
[15] cli_2.3.1        rstudioapi_0.13  DBI_1.1.1        xfun_0.22        haven_2.3.1      withr_2.4.1      xml2_1.3.2      
[22] httr_1.4.2       fs_1.5.0         generics_0.1.0   vctrs_0.3.6      hms_1.0.0        grid_4.0.4       tidyselect_1.1.0
[29] glue_1.4.2       R6_2.5.0         fansi_0.4.2      modelr_0.1.8     magrittr_2.0.1   backports_1.2.1  scales_1.1.1    
[36] ellipsis_0.3.1   rvest_1.0.0      assertthat_0.2.1 colorspace_2.0-0 utf8_1.2.1       stringi_1.5.3    munsell_0.5.0   
[43] broom_0.7.5      crayon_1.4.1 

我很困惑,谢谢

【问题讨论】:

    标签: r arrays matrix subset


    【解决方案1】:

    不要在对rownames(等)的调用中使用子集。

    ArrayX <- array(1:50, dim=c(5,5,2))
    ArrayX
    # , , 1
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    1    6   11   16   21
    # [2,]    2    7   12   17   22
    # [3,]    3    8   13   18   23
    # [4,]    4    9   14   19   24
    # [5,]    5   10   15   20   25
    # , , 2
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]   26   31   36   41   46
    # [2,]   27   32   37   42   47
    # [3,]   28   33   38   43   48
    # [4,]   29   34   39   44   49
    # [5,]   30   35   40   45   50
    
    colnames(ArrayX) <- paste0("coordX", 1:5)
    rownames(ArrayX) <- paste0("coordY", 1:5)
    ArrayX
    # , , 1
    #         coordX1 coordX2 coordX3 coordX4 coordX5
    # coordY1       1       6      11      16      21
    # coordY2       2       7      12      17      22
    # coordY3       3       8      13      18      23
    # coordY4       4       9      14      19      24
    # coordY5       5      10      15      20      25
    # , , 2
    #         coordX1 coordX2 coordX3 coordX4 coordX5
    # coordY1      26      31      36      41      46
    # coordY2      27      32      37      42      47
    # coordY3      28      33      38      43      48
    # coordY4      29      34      39      44      49
    # coordY5      30      35      40      45      50
    

    【讨论】:

    • 我知道您可以一次更改数组的两个组件的名称。我想要的只是访问其中一个矩阵,而不是整个数组。这根本不可能吗?
    • (1) matrix 只是array 的一个特例:数组可以有任意维数,矩阵总是二维的。 (2) 你试过colnames(ArrayX[,, 1]) &lt;- c(paste("coordX", 1:5, sep = "")),注意到数组没有改变,然后抱怨你只想“访问”(提取?)数组的一个平面? 我也很困惑
    • 如果我将代码 ArrayX[,,1] 粘贴到控制台中,我将得到数组中的第一个矩阵。如果我做 ArrayX[,,2] 第二个。我不想提取,只需在其中一个矩阵内更改列名或行名。
    • 哦,好,最后一点终于出来了……不,R不这样做。维度上的名称适用于该维度内的所有平面,因此应用于平面 (z) 1 上的行的名称与用于平面 2 上的行的名称相同。
    • “最后一点”已经在问题的一开始就说明了
    【解决方案2】:

    我们可以使用dimnames

    dimnames(ArrayX) <- list(paste0("coordY", 1:5), paste0("coordX", 1:5), NULL)
    

    -输出

    ArrayX
    #, , 1
    
    #           coordX1    coordX2    coordX3    coordX4    coordX5
    #coordY1  0.9450726  1.0642934  1.7164833 -1.1610352  2.6045781
    #coordY2 -0.2153065 -0.8209356  1.3052241 -0.5853774 -1.5833918
    #coordY3 -1.0333230  0.8766106 -0.5811332  0.9636683 -0.4263902
    #coordY4  0.8281970 -1.4391891  0.3491635  0.1239269  0.7396240
    #coordY5 -0.2048288  1.1179848 -0.8929726 -1.8674698 -2.0467980
    
    #, , 2
    
    #           coordX1    coordX2     coordX3    coordX4    coordX5
    #coordY1  0.1121423 -0.3015090 -0.18311717 -1.6025064  0.1504099
    #coordY2  1.2635544 -0.1770131  0.37860981 -0.6149095  0.1354814
    #coordY3  0.3219548  0.5072806 -0.02555505 -0.4057642 -0.7276835
    #coordY4 -0.1939912 -1.0914181 -0.92550545 -0.2285773 -0.6883232
    #coordY5  2.1722877 -0.8981309 -2.04296086  1.1754687 -1.3772374
    

    所有元素的属性应该相同。根据?array

    “dimnames”属性是可选的:如果存在,它是一个列表,每个维度都有一个组件,可以是 NULL,也可以是由该维度的“dim”属性元素给出的长度的字符向量。

    数据

    set.seed(24)
    ArrayX <- array(rnorm(5 * 5 *2), dim = c(5, 5, 2))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      相关资源
      最近更新 更多