【问题标题】:How to fill in nested lists?如何填写嵌套列表?
【发布时间】:2020-09-09 01:55:07
【问题描述】:

假设我的数据具有以下结构:

Phi_monthly<-array(matrix(1:3), c(10, 10, 2))
Phi_weekly<-array(matrix(1:3), c(10, 10, 2))
Phi_daily<-array(matrix(1:3), c(10, 10, 2))

我想使用这些信息创建一个嵌套列表。我想在一个列表中重复矩阵,但我想重复这个过程n 次,ndim(Phi_monthly)[3]。我的问题是我不怎么能重复这个过程。

让我解释得更好。例如dim(Phi_monthly)[3]为1时,代码如下:

PHI<-lapply(rapply(
      list(lapply(seq_len(1), function(X) Phi_daily[,,1]),
           lapply(seq_len(6), function(X) Phi_weekly[,,1]),
           lapply(seq_len(23), function(X) Phi_monthly[,,1])
      ),
      enquote, how="unlist"), eval)

如果dim(Phi_monthly)[3] 为 2,则代码为:

PHI<-lapply(rapply(
      list(lapply(seq_len(1), function(X) Phi_daily[,,2]),
           lapply(seq_len(6), function(X) Phi_weekly[,,2]),
           lapply(seq_len(23), function(X) Phi_monthly[,,2])
      ),
      enquote, how="unlist"), eval)

我想我只想创建一个列表 (PHI),其中包含 2 个 (dim(Phi_monthly)[3]) 嵌套列表,其中包含 30 个矩阵(我的代码的结果)

我的第一个想法是使用for,但我摔倒了。如果有人可以帮助我或给我一个线索,我将不胜感激。

【问题讨论】:

  • 1、6、23从何而来?
  • @jay.sf 1、6 和 23 是我想要重复矩阵的次数

标签: r arrays list matrix


【解决方案1】:

使用Map避免重复代码。

l3 <- lapply(1:dim(Phi_monthly)[3], function(i)
  unlist(Map(replicate, c(1, 6, 23), 
             list(Phi_daily[,,i], Phi_weekly[,,i], Phi_monthly[,,i]), 
             simplify=F), recursive=FALSE))

lengths(l3)
# [1] 30 30
length(l3)
# [1] 2

identical(all_lst, l3)
# [1] TRUE

【讨论】:

    【解决方案2】:

    这样的事情怎么样:

    all_lst <- lapply(1:dim(Phi_monthly)[3], 
           function(i){
             list(rep(list(Phi_daily[,,i]), 1),
                  rep(list(Phi_weekly[,,i]), 6),
                  rep(list(Phi_monthly[,,i]), 23)) %>% 
               unlist(recursive=FALSE)
             })
    lengths(all_lst)
    length(all_lst)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多