【问题标题】:How to create multiple null matrices in R?如何在 R 中创建多个空矩阵?
【发布时间】:2020-12-31 00:14:19
【问题描述】:

我想创建具有相同维度的 18 空矩阵,命名为 mat10cimat15ci、....、mat95ci。我试过下面的代码

for( s in seq(10,95,by=5)){
  paste0("mat",s,"ci")=array(NA, dim = c(10, 20))
}

我遇到了这个错误

target of assignment expands to non-language object

感谢您的帮助。

【问题讨论】:

  • 如果你打算以同样的方式处理多个矩阵,我强烈建议你将它们放在list 中,与list of frames 讨论非常相似。例如,lst_of_mtx <- lapply(seq(10,95,by=5), function(ign) array(dim = c(10, 20)))
  • 或者坦率地说,您可以将其作为单个 3d 数组处理,如 array(dim=c(10, 20, 18))

标签: r for-loop matrix null


【解决方案1】:

我推断您将对每个矩阵执行相同(或非常相似)的操作,在这种情况下,处理此问题的 R 惯用方法是将它们放在一个矩阵列表中。这与“帧列表”的方法相同,请参阅https://stackoverflow.com/a/24376207/3358272

对于矩阵列表,请尝试:

lst_of_mtx <- replicate(18, array(dim = c(10, 20)), simplify = FALSE)

作为替代方案,根据您的处理,您可以做一个 3d 数组

ary <- array(dim=2:4, dimnames=list(NULL,NULL,paste0("mat", c(10, 15, 20, 25), "ci")))
ary
# , , mat10ci
#      [,1] [,2] [,3]
# [1,]   NA   NA   NA
# [2,]   NA   NA   NA
# , , mat15ci
#      [,1] [,2] [,3]
# [1,]   NA   NA   NA
# [2,]   NA   NA   NA
# , , mat20ci
#      [,1] [,2] [,3]
# [1,]   NA   NA   NA
# [2,]   NA   NA   NA
# , , mat25ci
#      [,1] [,2] [,3]
# [1,]   NA   NA   NA
# [2,]   NA   NA   NA

您可以将数组的一个“切片”处理为

ary[,,"mat25ci"]
#      [,1] [,2] [,3]
# [1,]   NA   NA   NA
# [2,]   NA   NA   NA

【讨论】:

    【解决方案2】:

    也许你可以试试list2env + replicate

    list2env(
      setNames(
        replicate(18, array(NA, dim = c(10, 20)), simplify = FALSE),
        paste0("mat", seq(10, 95, by = 5), "ci")
      ),
      envir = .GlobalEnv
    )
    

    当你输入ls(),你会看到

    > ls()
     [1] "mat10ci" "mat15ci" "mat20ci" "mat25ci" "mat30ci" "mat35ci" "mat40ci"
     [8] "mat45ci" "mat50ci" "mat55ci" "mat60ci" "mat65ci" "mat70ci" "mat75ci"
    [15] "mat80ci" "mat85ci" "mat90ci" "mat95ci"
    

    【讨论】:

      【解决方案3】:

      试试assign

      for( s in seq(10,95,by=5)){
        assign (paste0("mat",s,"ci"), array(NA, dim = c(10, 20)))
      }
      

      【讨论】:

        【解决方案4】:

        我们也可以

        lst1 <- vector('list', 18)
        names(lst1) <- paste0("mat", seq(10, 95, by = 5), "ci")
        for(nm in names(lst1)) {
               lst1[[nm]] <- array(dim  c(10, 20))
         }
        list2env(lst1, .GlobalEnv)
        

        tidyverse 的选项使用rerun

        library(dplyr)
        library(purrr)
        library(stringr)
        18 %>%
            rerun(array(dim = c(10, 20))) %>% 
            set_names(str_c("mat", seq(10, 95, by = 5), "ci")) %>% 
            list2env(.GlobalEnv)
        

        【讨论】:

          猜你喜欢
          • 2014-03-02
          • 2015-09-19
          • 2019-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-30
          • 2012-11-25
          相关资源
          最近更新 更多