【问题标题】:Is there a R function to transform a list of lists of lists to a list of lists of vectors?是否有一个 R 函数可以将列表列表转换为向量列表列表?
【发布时间】:2020-07-11 22:27:30
【问题描述】:

我有一个列表列表,我想将其转换为元素将是向量的列表列表。

具体来说,l: list of 180 elementsl[[1]]: list of 12 elementsl[[1]][[1]]: list of 20 elements,每一个都有一个名字和一个值。如何得到一个12个元素的列表,其中每个元素是20个向量的列表,每个向量包含180个元素。

而不是调用 mapply(c,l[[1]][[1]]$id, l[[2]][[1]]$id, .... l[[180]][[1]]$id, SIMPLIFY=FALSE) 并为每个键重复此操作,有没有办法在循环中执行此操作?

例子:

> a<-list(1,'a',1.2)
> b<-list(2,'b',0.1)
> d<-list(3,'d',3)
> e<-list(4,'e',0.1)
> x<-list(a,b)
> y<-list(d,e)
> z<-list(x,y)

想要的输出:

#> [[1]]
#> [[1]][[1]]
#> [1] 1 3
#> 
#> [[1]][[2]]
#> [1] 'a' 'd'
#>
#> [[1]][[3]]
#> [1] 1.2 3
#>
#> [[2]][[1]]
#> [1] 2 4
#>
#> [[2]][[2]]
#> [1] 'b' 'e'
#>
#> [[2]][[3]]
#> [1] 0.1 0.1

有什么想法吗?

【问题讨论】:

    标签: r list vector


    【解决方案1】:

    也许您可以尝试嵌套Map,如下所示

    z <- Map(function(...) Map(c,...), x,y)
    

    这样

    > z
    [[1]]
    [[1]][[1]]
    [1] 1 3
    
    [[1]][[2]]
    [1] "a" "d"
    
    [[1]][[3]]
    [1] 1.2 3.0
    
    
    [[2]]
    [[2]][[1]]
    [1] 2 4
    
    [[2]][[2]]
    [1] "b" "e"
    
    [[2]][[3]]
    [1] 0.1 0.1
    

    【讨论】:

      【解决方案2】:

      你可以嵌套lapply

      样本数据:

      a <- list(1, 2, 3)
      b <- list(a, a)
      x <- list(b, b)
      x
      #> [[1]]
      #> [[1]][[1]]
      #> [[1]][[1]][[1]]
      #> [1] 1
      #> 
      #> [[1]][[1]][[2]]
      #> [1] 2
      #> 
      #> [[1]][[1]][[3]]
      #> [1] 3
      #> 
      #> 
      #> [[1]][[2]]
      #> [[1]][[2]][[1]]
      #> [1] 1
      #> 
      #> [[1]][[2]][[2]]
      #> [1] 2
      #> 
      #> [[1]][[2]][[3]]
      #> [1] 3
      #> 
      #> 
      #> 
      #> [[2]]
      #> [[2]][[1]]
      #> [[2]][[1]][[1]]
      #> [1] 1
      #> 
      #> [[2]][[1]][[2]]
      #> [1] 2
      #> 
      #> [[2]][[1]][[3]]
      #> [1] 3
      #> 
      #> 
      #> [[2]][[2]]
      #> [[2]][[2]][[1]]
      #> [1] 1
      #> 
      #> [[2]][[2]][[2]]
      #> [1] 2
      #> 
      #> [[2]][[2]][[3]]
      #> [1] 3
      

      现在只需通过嵌套的lapply 函数调用unlist

      lapply(x, function(x) lapply(x, unlist))
      #> [[1]]
      #> [[1]][[1]]
      #> [1] 1 2 3
      #> 
      #> [[1]][[2]]
      #> [1] 1 2 3
      #> 
      #> 
      #> [[2]]
      #> [[2]][[1]]
      #> [1] 1 2 3
      #> 
      #> [[2]][[2]]
      #> [1] 1 2 3
      

      reprex package (v0.3.0) 于 2020 年 3 月 31 日创建

      【讨论】:

      • 这些列表的长度相同,我想将它们转换为向量列表。
      • @Cecile 这需要一个列表列表,并将其转换为向量列表。这正是你所说的目标。无论列表的长度如何,这都将起作用。如果这不是您的想法,您是否可以扩展您的问题,也许是一个玩具示例和预期的输出?我相信我们可以提供帮助。
      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 2021-02-24
      • 1970-01-01
      • 2016-05-27
      • 2021-01-18
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多