【问题标题】:Using lapply function within another one avoiding list of lists在另一个避免列表列表中使用 lapply 函数
【发布时间】:2018-06-19 22:26:33
【问题描述】:

假设在 R 中的一个示例,我们在同一个函数中使用 lapply 函数来创建一个一级列表:

lapply(1:5, function(x)
{
  r <- sample(4,1)

  i<-lapply(1:r, function (y)
  {
    matrix(rep(1*x*y,3))
  })
  i
})

给定的结果是一个像这样的两级列表(list of lists):

[[1]]
[[1]][[1]]
     [,1]
[1,]    1
[2,]    1
[3,]    1


[[2]]
[[2]][[1]]
     [,1]
[1,]    2
[2,]    2
[3,]    2

[[2]][[2]]
     [,1]
[1,]    4
[2,]    4
[3,]    4

[[2]][[3]]
     [,1]
[1,]    6
[2,]    6
[3,]    6

[[2]][[4]]
     [,1]
[1,]    8
[2,]    8
[3,]    8


[[3]]
[[3]][[1]]
     [,1]
[1,]    3
[2,]    3
[3,]    3

[[3]][[2]]
     [,1]
[1,]    6
[2,]    6
[3,]    6


# ...

同时保留lapply 函数(或类似的函数)和矩阵具有相同的维度,我们如何得到一个单级列表?

[[1]]
     [,1]
[1,]    1
[2,]    1
[3,]    1

[[2]]
     [,1]
[1,]    2
[2,]    2
[3,]    2

[[3]]
     [,1]
[1,]    4
[2,]    4
[3,]    4

# ...

【问题讨论】:

  • lapply 总是返回一个list。 (这就是名称中的 l 所代表的含义。)使用 sapply 代替 simplify。
  • 如果j是你的代码返回的对象,你可以试试unlist(j,recursive=FALSE)
  • @Gregor,您的建议不要保留相同维度的矩阵。

标签: r list matrix lapply nested-lists


【解决方案1】:

将第二个lapply 替换为sapply 并包含参数simplify = TRUE

【讨论】:

  • simplify = TRUEsapply 的默认值,您不需要包含它。为了使它成为更好的答案,您应该显示完整的代码。 (我不确定这实际上是否复制了 OP 所需的输出)。
  • 我认为这会将所有嵌套的 1 列矩阵推入更宽的矩阵中。我认为 OP 想保持矩阵分开,但只是减少嵌套层。
  • 这种变化不会像@wibeasley 所说的那样保留矩阵的维度。
【解决方案2】:

我很好奇purrr 如何最好地容纳列表中的矩阵。最后的flatten() 行相当于@nicola 建议使用unlist(., recursive=F)

library(magrittr)
purrr::map(1:5, function(x) {
  r <- sample(4,1)

  purrr::map(1:r, function(y) {
    matrix(rep(1*x*y,3))
  }) 
}) %>% 
purrr::flatten() #This line is the equivalent of nicola's `unlist()`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2022-11-30
    相关资源
    最近更新 更多