代码之家  ›  专栏  ›  技术社区  ›  Bioinfotec

如何在R中将两个嵌套列表合并为一个列表?

  •  0
  • Bioinfotec  · 技术社区  · 5 月前

    我有一个列表,其中嵌套了这样一个列表:

     >>>View(mylist)
    [
    
    [{"id":1, "name": "Jack"},{"id":2, "name": "Mike"}],
    
    [{"id":3, "name": "Mary"},{"id":4, "name": "Bob"}],
    
    ]
    

    现在,我想删除这个列表的内层,所以它应该是:

     >>>View(mylist)
    [
    
    {"id":1, "name": "Jack"},{"id":2, "name": "Mike"},
    
    {"id":3, "name": "Mary"},{"id":4, "name": "Bob"},
    
    ]
    

    在python中,只需使用压缩列表即可轻松实现:

    [subitem for item in mylist for subitem in item]
    

    或使用itertools:

    import itertools
    list(itertools.chain.from_iterable(mylist))
    

    然而,在R语言中,我觉得有点棘手。我尝试使用do.call:

    do.call(c, mylist)
    

    它工作得很好。然而,当我的嵌套列表像这样大时:

    enter image description here

    enter image description here

    使用do.call()后,我得到了这样的结果:

    enter image description here

    输出格式与之前不同,那么问题是什么?

    顺便说一下,您可以使用以下R代码构造上述“mylist”:

    mylist <- list(
      list(
        list(id = 1, name = "Jack"),
        list(id = 2, name = "Mike")
      ),
      list(
        list(id = 3, name = "Mary"),
        list(id = 4, name = "Bob")
      )
    )
    

    以及“数据1”:

    data1 <- list(
      data.frame(
        id = c(3, 4),
        name = c("John", "Anna")
      ),
      data.frame(
        id = c(5, 6),
        name = c("Tom", "Jerry")
      )
    )
    
    1 回复  |  直到 5 月前
        1
  •  1
  •   Ronak Shah    5 月前

    这里有一个使用基数R的选项-

    我们 unlist mylist 将数据帧中的各个元素翻转一个级别 rbind 他们在一起。自从 data1 我们已经可以列出数据帧了 rbind 他们直接。

    最后,我们将这两个数据集组合在一起以获得最终输出。

    # Thanks to @Friede for the comment. 
    data_1 <- do.call(rbind.data.frame, unlist(mylist, recursive = FALSE))
    data_2 <- do.call(rbind, data1)
    
    rbind(data_1, data_2)
    
    #  id  name
    #1  1  Jack
    #2  2  Mike
    #3  3  Mary
    #4  4   Bob
    #5  3  John
    #6  4  Anna
    #7  5   Tom
    #8  6 Jerry
    

    请注意,临时变量 data_1 data_2 只是为了清楚起见而创建的,不是必需的。