2012-09-28 22 views

Odpowiedz

13

Oto jeden sposób:

## your list 
ll <- list("1" = 1:2, "2" = 1:3, "3" = 1:2) 
## convert to data.frame 
dl <- data.frame(ID = rep(names(ll), sapply(ll, length)), 
       Obs = unlist(ll)) 

Daje:

> dl 
    ID Obs 
11 1 1 
12 1 2 
21 2 1 
22 2 2 
23 2 3 
31 3 1 
32 3 2 

Pierwszy wiersz w zaproszeniu data.frame() to tylko niektóre kod powtórzyć names() z następujących wymień wymaganą liczbę razy. Drugi wiersz po prostu zapisuje listę, przekształcając ją w wektor.

+0

Podałem prawidłową odpowiedź, ponieważ twoja metoda była najszybsza:
> system.time (topienie (X))
użytkownika System upływie
3,12 0,11 3,24
> system.time (data.frame (J = rep (nazwy (X) sapply (x długość)) obs = wyświetlać na liście (X)))
użytkownika system upływie
0.08 0.00 0.07

+0

Nie mogę dodać przerw w linii, przepraszam za bałagan: S –

6

użytkowania reshape2 i melt który ma metodę melt.list

.list <- list(`1` = 1:2, `2` = 1:3, `3` = 1:2) 
library(reshape2) 
melt(.list) 
## value L1 
## 1  1 1 
## 2  2 1 
## 3  1 2 
## 4  2 2 
## 5  3 2 
## 6  1 3 
## 7  2 3 
1

Roztwór użyciu funkcji bazowych

List <- list('1'=c(1,2), '2'= c(1,2,3), '3'=1) 
x <- unlist(List) # as suggested by Gavin Simpson 
data.frame(ID=substr(names(x),1,1), Obs=x) 
    ID Obs 
11 1 1 
12 1 2 
21 2 1 
22 2 2 
23 2 3 
3 3 1 

Jeśli chcesz rownames być 1,2,3,4,5,6 try to (za pomocą setNames):

data.frame(ID=substr(names(x),1,1), Obs=setNames(x, NULL)) 
    ID Obs 
1 1 1 
2 1 2 
3 2 1 
4 2 2 
5 2 3 
6 3 1 

To rozwiązanie jest ważna tylko wtedy, gdy wszystkie nazwy mają taką samą długość, inaczej” Zdaję sobie sprawę, że lepiej będzie użyć rozwiązania Gavina. Patrz na przykład:

List2 <- list('week1'=c(1,2), 'week2'= c(1,2,3), 'week3'=1) 
x <- unlist(List2) 
data.frame(ID=substr(names(x),1,nchar(names(x)[1])-1), Obs=setNames(x, NULL)) 

    ID Obs 
1 week1 1 
2 week1 2 
3 week2 1 
4 week2 2 
5 week2 3 
6 week3 1 
+0

myślę, że można po prostu zrobić 'x <- nie wyświetlać na liście (lista)' nie mogę ty? –

+0

@Gavin Simpson masz rację, teraz właśnie zredagowałem swoją odpowiedź, w tym twój komentarz. –

+0

Wygląda na to, że gdy go wyślemy, dodaje on numer do nazwy elementu, co powoduje, że reszta skryptu zawodzi w moim celu: S –

1

Dobrym i nadal brakuje alternatywy do już opublikowanych rozwiązań jest stack -function:

df <- stack(ll)[2:1] 

co daje:

> df 
    ind values 
1 1  1 
2 1  2 
3 2  1 
4 2  2 
5 2  3 
6 3  1 
7 3  2 

Korzystanie setNames jak również, możesz uzyskać dokładny format:

df <- setNames(stack(ll)[2:1], c('ID','Obs')) 

co daje:

> df 
    ID Obs 
1 1 1 
2 1 2 
3 2 1 
4 2 2 
5 2 3 
6 3 1 
7 3 2 

Używane dane:

ll <- list("1" = 1:2, "2" = 1:3, "3" = 1:2) 
Powiązane problemy