Dodawanie listy do listy list w R

Mam problemy z dołączaniem danych do listy, która jest już w formacie listy. Mam program, który wyeksportuje obiekty wyników podczas pętli symulacji. Same dane są przechowywane jako lista macierzy. Moim pomysłem jest przechowywanie tych list w liście, a następnie zapisanie tej listy jako obiektu R do późniejszej analizy, jednak mam pewne problemy z prawidłowym osiągnięciem tego. Pokażę, co zrobiłem z małym abstrakcyjnym przykładem tylko za pomocą wartości zamiast danych macierzy z mojego symulacja:

Powiedzmy, że uruchomiłem pętlę symulacyjną 3 razy. Podczas iteracji, listy wyników muszą być zebrane w jedną listę list, które zapiszę jako obiekt R:

Lista zawiera Pozostałe listy i jest zapisywana: outlist1 <- list()

Pierwsza iteracja: resultsa <- list(1,2,3,4,5)

outlist <- append(outlist1,resultsa)

Druga Iteracja: resultsb <- list(6,7,8,9,10)

outlist <- append(outlist1,b)

Trzecia Iteracja: resultsc <- list(11,12,13,14,15)

outlist <- list(outlist2,c)

Jednak To rozwiązanie nie działa przy rozwijaniu listy zawierającej lista w ten sposób, pożądany rezultat to:

>outlist
[[1]]
[[1]][[1]]
[1] 1

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

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

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

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


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

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

[[2]][[3]]
[1] 8

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

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


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

[[3]][[2]]
[1] 12

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

[[3]][[4]]
[1] 14

[[3]][[5]]
[1] 15

Jednak zamiast tego dostaję:

> outlist3
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] 1

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

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

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

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


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

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

[[1]][[2]][[3]]
[1] 8

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

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

Jak wyhodować listę tak, aby sformatowana lista była jak pożądany rezultat? Jeśli dokonam dalszej analizy tej listy, muszę mieć łatwy dostęp do elementów.

Author: amonk, 2013-02-13

5 answers

Czy to może być to, co chcesz mieć:

# Initial list:
myList <- list()

# Now the new experiments
for(i in 1:3){
  myList[[length(myList)+1]] <- list(sample(1:3))
}

myList
 59
Author: Daniel Fischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-11 14:52:37
outlist <- list(resultsa)
outlist[2] <- list(resultsb)
outlist[3] <- list(resultsc)

append's help file mówi, że jest dla wektorów. Ale można go użyć tutaj. Myślałem, że próbowałem tego wcześniej, ale były pewne dziwne anomalie w kodzie OP, które mogły mnie wprowadzić w błąd: {]}

outlist <- list(resultsa)
outlist <- append(outlist,list(resultsb))
outlist <- append(outlist,list(resultsc))

Te same wyniki.

 13
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 17:27:14

Istnieją dwa inne rozwiązania, które polegają na przypisaniu do indeksu jednego po końcu listy. Oto rozwiązanie, które używa append.

resultsa <- list(1,2,3,4,5)
resultsb <- list(6,7,8,9,10)
resultsc <- list(11,12,13,14,15)

outlist <- list(resultsa)
outlist <- append(outlist, list(resultsb))
outlist <- append(outlist, list(resultsc))

Który podaje żądany format

> str(outlist)
List of 3
 $ :List of 5
  ..$ : num 1
  ..$ : num 2
  ..$ : num 3
  ..$ : num 4
  ..$ : num 5
 $ :List of 5
  ..$ : num 6
  ..$ : num 7
  ..$ : num 8
  ..$ : num 9
  ..$ : num 10
 $ :List of 5
  ..$ : num 11
  ..$ : num 12
  ..$ : num 13
  ..$ : num 14
  ..$ : num 15
 9
Author: Brian Diggs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 16:08:57

Ta odpowiedź jest podobna do przyjętej, ale nieco mniej zawiła.

L<-list()
for (i in 1:3) {
L<-c(L, list(list(sample(1:3))))
}
 7
Author: Eduardo Bergel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 02:46:33

Poprzez przypisanie listy do zmiennej jako pierwszej

myVar <- list()

Otwiera możliwość przypisań hiearchialnych przez

myVar[[1]] <- list()
myVar[[2]] <- list()

I tak dalej... więc teraz Można zrobić

myVar[[1]][[1]] <- c(...)
myVar[[1]][[2]] <- c(...)

Lub

myVar[[1]][['subVar']] <- c(...)

I tak dalej

Możliwe jest również przypisywanie nazw bezpośrednio (zamiast$)

myVar[['nameofsubvar]] <- list()

A następnie

myVar[['nameofsubvar]][['nameofsubsubvar']] <- c('...')

Ważne jest, aby zawsze używać podwójnych nawiasów, aby system działał

Następnie, aby uzyskać informacje jest simple

myVar$nameofsubvar$nameofsubsubvar

I tak dalej...

Przykład:

a <-list()
a[['test']] <-list()
a[['test']][['subtest']] <- c(1,2,3)
a
$test
$test$subtest
[1] 1 2 3


a[['test']][['sub2test']] <- c(3,4,5)
a
$test
$test$subtest
[1] 1 2 3

$test$sub2test
[1] 3 4 5

Ładna cecha języka R w jego definicji hiearchialnej...

Użyłem go do skomplikowanej implementacji (z więcej niż dwoma poziomami) i działa!

 4
Author: Jesse Burström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-28 23:35:39