Вопрос по r – Р. Как составить список списков в R?

38

Я не знаю, как составить список списков в R. У меня есть несколько списков, я хочу хранить их в одной структуре данных, чтобы облегчить доступ к ним. Однако, похоже, что вы не можете использовать список списков в R, поэтому, если я получу список l1 из другого списка, скажем, l2, то я не смогу получить доступ к элементам 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 должен быть списком!

Ваш Ответ

4   ответа
43

Вы можете легко составлять списки списков

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
@ capoluca Чтобы объяснить объяснения Дэйсона,list_all[1] не выбирает первыйэлемен oflist_all. Для списков,[ получает Подсписки в то время как[[ получает Элементы. joran
Если вы создаете список дубликатов, например,mylist <- list(list1, list1), являетсяlist1 скопированы или на которые есть ссылки дважды? bright-star
Что, если я создаю список списков в цикле, и поэтому у меня нет отдельных подсписков, вычисленных и сохраненных в переменных. Скорее, я хочу добавить их в список списков один за другим по мере их вычисления. Leonid
@ Leonid Звучит так, будто вы должны написать свой вопрос, но есть ли причина, по которой вы не используете что-то вродеlapply? Dason
7

Используя твой пример ::

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"
2

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
-1

Как уже говорили другие ответы более сложным способом, вы сделалиуж создать список списков! Это просто странный вывод 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"

Похожие вопросы