2013-02-13 12 views
35

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 symulacyjnej. Same dane są przechowywane jako lista macierzy. Moim pomysłem jest przechowywanie tych list na liście, a następnie zapisanie tej listy list jako obiektu R do późniejszej analizy, jednak mam pewne problemy z jej osiągnięciem. Pokażę, co zrobiłem z małym abstrakcyjnym przykładem, używając tylko wartości zamiast danych macierzy z mojej symulacji: Powiedz, że uruchomiłem pętlę symulacyjną 3 razy. trakcie iteracji, wyniki wykazy muszą być zbierane do jednej listy list, że będę zapisać jako przedmiot R:Dołączanie listy do listy list w R

Lista zawierać inne listy i być zapisane: outlist1 <- list()

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

outlist <- append(outlist1,resultsa)

drugiej iteracji: resultsb <- list(6,7,8,9,10)

outlist <- append(outlist1,b)

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

outlist <- list(outlist2,c)

Jednak to rozwiązanie nie działa z rosnącą listę zawierających wykazy ten sposób, żądany wynik 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 otrzymuję:

> 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 rozwinąć listę tak, aby sformatowana lista była podobna do pożądanego rezultatu? Jeśli przeprowadzę dalszą analizę na tej liście, muszę mieć łatwy dostęp do elementów.

+0

Nadpisujesz 'outlist' za każdym razem. zauważ, że podczas dodawania nie masz "outlist" w swoim drugim argumencie. – kmace

Odpowiedz

54

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 
+0

To dokładnie to. Druga część zawarta w nawiasie listy robi różnicę. Zapewnia wymagany format i zapobiega ostrzeżeniu o wielokrotności długości obiektu. Miałem wcześniej, kiedy próbowałem ekwiwalentu 'List [[długość (Lista) +1]] <- próbka (1: 3)', aby spróbować osiągnąć rozwiązanie. Dziękuję Ci! – Ward9250

+8

Można również użyć c (.., ..) do połączenia dwóch "list list". Musisz tylko upewnić się, że oba argumenty do c() są listami list. –

+0

Doskonale! Jedyny przydatny przykład, który znalazłem, chociaż pokazuję, że R jest okropnym językiem! – chao

13
outlist <- list(resultsa) 
outlist[2] <- list(resultsb) 
outlist[3] <- list(resultsc) 

append „s plik pomocy mówi, że jest na wektorach. Ale można go tutaj wykorzystać. Myślałem, że próbowałem wcześniej, ale było kilka dziwnych anomalii w kodzie programu operacyjnego, które może mieć błąd mnie:

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

same wyniki.

+3

Nitpick: 'is.vector (list())' zwraca TRUE :) –

9

Istnieją jeszcze dwa inne rozwiązania, które polegają na przypisaniu do indeksu jeden za końcem 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)) 

co daje w wybranym formacie

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

Stawiając zadanie z listy na zmienną pierwszy

myVar <- list() 

otwiera możliwość przypisania hiearchial przez

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

i tak dalej ... więc teraz jest to możliwe do zrobienia

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

lub

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

i tak dalej

możliwe jest również, aby przypisać bezpośrednio nazwy (zamiast $)

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

i następnie

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

ważne jest, aby pamiętać, aby zawsze używać podwójnych nawiasów aby działał system

następnie uzyskać informacje jest prosta

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 

fajna cecha języka R w jego definicji hiearchialnej ...

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

6

Ta odpowiedź jest podobna do akceptowanej, ale nieco mniej skomplikowana.

L<-list() 
for (i in 1:3) { 
L<-c(L, list(list(sample(1:3)))) 
}