如何将所有子列表元素合并成一个列表

11
我有一个列表(长度为3),由子列表组成(每个子列表的长度不同-2、2、3)。我想将所有内容存储为一个大列表(例如,没有子列表-只有一个长度为7的列表)。我知道如何手动完成,但是否有可用的函数或命令?
我希望能够对任意长度的列表和子列表执行此操作。
以下是列表的示例:
[[1]]
[[1]][[1]]
      name  n       l_1         t         t_3          t_4          t_5 cluster
12  563035 19  9.263158 0.2017045  0.06379453  0.075876830  0.095852895       1
14  563037 19  8.026316 0.2076503  0.05634675  0.098684211 -0.104566563       1


[[1]][[2]]
      name  n       l_1         t         t_3          t_4          t_5 cluster
13  563036 20  7.200000 0.1838450 -0.06428098  0.085681987 -0.011070830       2
17  563042 20  7.725000 0.2168285  0.15161037  0.117570045 -0.067102568       2


[[2]]
[[2]][[1]]
      name  n       l_1          t          t_3          t_4           t_5 cluster
1   561101 11  6.772727 0.19731544  0.029478458 -0.128117914  6.235828e-02       1
44  563080 11  7.545455 0.18554217  0.103896104  0.285714286 -2.164502e-02       1


[[2]][[2]]
      name  n       l_1         t         t_3           t_4          t_5 cluster
48  566017 33 10.400000 0.2037624  0.16432326  0.1166006937 -0.012830017       2
49  566018 22  9.218182 0.2113271  0.30646667  0.2502280702  0.189838207       2
50  566020 19 11.736842 0.3111609  0.51217445  0.5147883012  0.462723120       2


[[3]]
[[3]][[1]]
      name  n       l_1         t         t_3         t_4         t_5 cluster
158 568004 18  8.722222 0.1787186 -0.05083857  0.06498952  0.06918239       1
161 568046 19 11.794737 0.3646190  0.54582540  0.49747236  0.32255755       1
162 568047 18 12.916667 0.3366224  0.53523112  0.40464111  0.29960541       1
163 568048 20 11.590000 0.3918986  0.50007725  0.43039556  0.34299752       1


[[3]][[2]]
      name  n       l_1         t         t_3        t_4         t_5 cluster
165 568050 20  9.125000 0.2034607  0.29789747 0.31073776  0.09157738       2
167 568054 20  8.850000 0.1332144  0.09895833 0.18636204  0.04641544       2



[[3]][[3]]
      name  n       l_1         t         t_3          t_4          t_5 cluster
168 568058 20  8.675000 0.2012741  0.18161266  0.200319163 -0.009375416       3
170 568061 18 24.861111 0.7394676  0.91836281  0.928317483  0.905563950       3

非常感谢,Sylvia。

5
你是说像这样 unlist(mylist, recursive = FALSE)(其中"mylist"是你的列表的名称)吗? - A5C1D2H2I1M1N2O1R2T1
1
是的,非常感谢您的帮助。那正是我想要的。再次感谢! - Sylvia
2
@AnandaMahto如果你不把它发布为答案,我会的;)。 - Paul Hiemstra
@PaulHiemstra,回答已发布 :) - A5C1D2H2I1M1N2O1R2T1
1
+1 因为不是重复问题,而且标题选得好。 - Frank
我已经在这个问题中发布了一些示例数据,以便重新创建数据在这里 - A5C1D2H2I1M1N2O1R2T1
3个回答

16

对于您的具体问题,答案很简单:

unlist(mylist, recursive = FALSE)

不过,您问如何对具有任意数量子列表的列表执行此操作。这有点棘手。幸运的是,Akhil S Bhel已经为我们解决了这个问题,并创建了一个名为 LinearizeNestedList 的函数。他的网站目前无法访问,但我将他的函数放在 Github Gist 上。

首先,我们将创建一些示例数据,其中包含嵌套列表。

NList <- list(a = "a", # Atom
              b = 1:5, # Vector
              c = data.frame(x = runif(5), y = runif(5)), 
              d = matrix(runif(4), nrow = 2), 
              e = list(l = list("a", "b"), 
                       m = list(1:5, 5:10),
                       n = list(list(1), list(2)))) 

源列表如下所示。请注意在嵌套列表项“e”中发生的嵌套。

NList
# $a
# [1] "a"
# 
# $b
# [1] 1 2 3 4 5
# 
# $c
#           x          y
# 1 0.7893562 0.47761962
# 2 0.0233312 0.86120948
# 3 0.4772301 0.43809711
# 4 0.7323137 0.24479728
# 5 0.6927316 0.07067905
# 
# $d
#            [,1]      [,2]
# [1,] 0.09946616 0.5186343
# [2,] 0.31627171 0.6620051
# 
# $e
# $e$l
# $e$l[[1]]
# [1] "a"
# 
# $e$l[[2]]
# [1] "b"
# 
# 
# $e$m
# $e$m[[1]]
# [1] 1 2 3 4 5
# 
# $e$m[[2]]
# [1]  5  6  7  8  9 10
# 
# 
# $e$n
# $e$n[[1]]
# $e$n[[1]][[1]]
# [1] 1
# 
# 
# $e$n[[2]]
# $e$n[[2]][[1]]
# [1] 2
你可以看到LinearizeNestedList如何“展平”所有子列表,因此您最终会得到一个单一的列表。
LinearizeNestedList(NList)
# $a
# [1] "a"
# 
# $b
# [1] 1 2 3 4 5
# 
# $c
#           x          y
# 1 0.7893562 0.47761962
# 2 0.0233312 0.86120948
# 3 0.4772301 0.43809711
# 4 0.7323137 0.24479728
# 5 0.6927316 0.07067905
# 
# $d
#            [,1]      [,2]
# [1,] 0.09946616 0.5186343
# [2,] 0.31627171 0.6620051
# 
# $`e/l/1`
# [1] "a"
# 
# $`e/l/2`
# [1] "b"
# 
# $`e/m/1`
# [1] 1 2 3 4 5
# 
# $`e/m/2`
# [1]  5  6  7  8  9 10
# 
# $`e/n/1/1`
# [1] 1
# 
# $`e/n/2/1`
# [1] 2 
顺便提一下,我忘了提到你也可以在R语言中将list中的data.frame展开(因为data.frame在R中是list的一种特殊类型)。
如果你真的想要将所有东西都展开(除了数组,因为它们只是具有dim属性的向量),请在调用LinearizeNestedList时添加LinearizeDataFrames = TRUE:
LinearizeNestedList(NList, LinearizeDataFrames=TRUE)

亲爱的Ananda,非常感谢您的出色回复。这两个都完美地满足了我的需求。再次感谢您的及时回复。Sylvia - Sylvia
1
@user2853331,如果这个回答完全解决了你的问题,请考虑通过点击答案左侧的空箭头来“接受”它。 - A5C1D2H2I1M1N2O1R2T1
谢谢Ananda。是的,它完全回答了我的问题。这是我第一次发帖,所以我不知道如何接受你的答案。我现在已经做到了。Sylvia - Sylvia

0
这样怎么样:
dissolve <- function(x){
  operator <- function(x){
    if(is.list(x)){
      for(i in seq(x)){
        operator(x[[i]])
      }
    }else{
      combi[[length(combi)+1]] <<- x
    }
  }
  combi=list()
  operator(x)
  return(combi)
}

-1

...unlist(mylist)怎么工作?


1
非常感谢!我按照上面的某位评论者提到的使用unlist(mylist, recursive = FALSE),它完美地解决了我的问题。感谢您的回答。 - Sylvia
1
这不会将子列表保持为列表项。您需要使用recursive = FALSE步骤。 - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto 但是原帖想要的是“没有子列表 - 只有一个长度为7的列表”。 - Hong Ooi
@HongOoi,抱歉给你点了个踩,但这个回答是错误的。 - A5C1D2H2I1M1N2O1R2T1
@HongOoi,从这里获取一些示例数据,并将unlist(mylist)unlist(mylist, recursive = FALSE)LinearizeNestedList(mylist)进行比较,对于NList(在 pastebin 链接中也包含),请做同样的操作。 - A5C1D2H2I1M1N2O1R2T1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接