如何在R中创建一个列表的列表?

64
我不知道如何在R中创建一个列表的列表。 我有几个列表,想将它们存储在一个数据结构中以便更容易地访问它们。然而,在R中似乎不能使用列表的列表,所以如果我从另一个列表l2中获取列表l1,那么我无法访问元素l1。我该怎么实现呢? 编辑- 我会展示一个对我无效的例子:
list1 <- list()
list1[1] = 1
list1[2] = 2
list2 <- list()
list2[1] = 'a'
list2[2] = 'b'
list_all <- list(list1, list2)
a = list_all[1]
a[2]
#[[1]]
#NULL

但是a应该是一个列表!

5个回答

71

你可以轻松地创建列表的列表

list1 <- list(a = 2, b = 3)
list2 <- list(c = "a", d = "b")
mylist <- list(list1, list2)

现在,mylist是包含两个列表的列表。要访问list1,您可以使用mylist[[1]]。如果您想要像mylist$list1这样做某事,那么您需要进行类似操作

mylist <- list(list1 = list1, list2 = list2)
# Now you can do the following
mylist$list1

编辑:回复您的编辑。只需使用双括号索引。

a <- list_all[[1]]
a[[1]]
#[1] 1
a[[2]]
#[1] 2

9
为了进一步解释Dason的说明,list_all[1]并不是选择list_all中的第一个元素。对于列表来说,[可以检索子列表,而[[可以检索元素。 - joran
如果您创建一个重复列表的列表,例如 mylist <- list(list1, list1),那么 list1 是被复制还是被引用了两次? - bright-star
如果我正在循环中创建一个列表的列表,因此我没有计算并存储在变量中的单个子列表。相反,我希望在计算它们时逐个将它们添加到列表的列表中。 - Leonid
@Leonid 听起来你应该发表自己的问题,但是你不使用像 lapply 这样的东西有什么原因吗? - Dason
1
@Leonid 我的列表 = 追加(我的列表, 列表(列表3)) - Luke

11

使用您提供的例子:

list1 <- list()
list1[1] = 1
list1[2] = 2
list2 <- list()
list2[1] = 'a'
list2[2] = 'b'
list_all <- list(list1, list2)

使用"[[ ]]"来提取列表中的元素:

b = list_all[[1]]
 b
[[1]]
[1] 1

[[2]]
[1] 2

class(b)
[1] "list"

10
如果你想要维护一个列表的列表(类似于Python中的list.append()),那么可以尝试以下方法:
a <- list(1,2,3)
b <- list(4,5,6)
c <- append(list(a), list(b))

> c
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2

[[1]][[3]]
[1] 3


[[2]]
[[2]][[1]]
[1] 4

[[2]][[2]]
[1] 5

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

3

该示例在循环中创建了一个命名列表的列表。

  MyList <- list()
  for (aName in c("name1", "name2")){
    MyList[[aName]] <- list(aName)
  }
  MyList[["name1"]]
  MyList[["name2"]]

为了添加另一个名为“name3”的列表,请编写以下内容:
  MyList$name3 <- list(1, 2, 3)

0

正如其他答案已经以更复杂的方式指出的那样,你已经创建了一个列表的列表!只是 R 的奇怪输出让人困惑(所有人?)。试试这个:

> str(list_all)
List of 2
 $ :List of 2
  ..$ : num 1
  ..$ : num 2
 $ :List of 2
  ..$ : chr "a"
  ..$ : chr "b"

最简单的结构将是这样的:

> str(list(list(1, 2), list("a", "b")))
List of 2
 $ :List of 2
  ..$ : num 1
  ..$ : num 2
 $ :List of 2
  ..$ : chr "a"
  ..$ : chr "b"

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