2017-09-20 6 views

Répondre

6

Je pense que rien ne sera plus facile que d'utiliser la stack -fonction de la base R:

df <- stack(l) 

vous donne un dataframe retour:

> df 
    values ind 
1  1 x 
2  2 x 
3  3 y 
4  4 y 
5  5 y 

Parce que vous avez demandé tibble en tant que sortie, vous pouvez faire as_tibble(df) (du tibble -package) pour l'obtenir. Ou plus directement: df <- as.tibble(stack(l)).


Une autre méthode de base R pur:

df <- data.frame(ind = rep(names(l), lengths(l)), value = unlist(l), row.names = NULL) 

qui donne un résultat similaire:

> df 
    ind value 
1 x  1 
2 x  2 
3 y  3 
4 y  4 
5 y  5 

Le row.names = NULL est pas forcément nécessaire mais donne rownumbers comme rownames.

1

Nous pouvons utiliser melt de reshape2

library(reshape2) 
melt(l) 
# value L1 
#1  1 x 
#2  2 x 
#3  3 y 
#4  4 y 
#5  5 y 
0

De tidyverse:

l %>% 
    map(~ as_tibble(.x)) %>% 
    map2(names(.), ~ add_column(.x, Name = rep(.y, nrow(.x)))) %>% 
    bind_rows() 

nous donner

# A tibble: 5 × 2 
    value Name 
    <dbl> <chr> 
1  1  x 
2  2  x 
3  3  y 
4  4  y 
5  5  y 

La fonction de pile de la base R est idéale pour les listes simples comme l'a montré Jaap.

Cependant, avec des listes plus complexes comme:

l <- list(
    a = list(num = 1:3, let_a = letters[1:3]), 
    b = list(num = 101:103, let_b = letters[4:6]), 
    c = list() 
) 

nous obtenons

stack(l) 

values ind 
1  1 a 
2  2 a 
3  3 b 
4  a b 
5  b a 
6  c a 
7  101 b 
8  102 b 
9  103 a 
10  d a 
11  e b 
12  f b 

ce qui est faux.

La solution tidyverse montré ci-dessus fonctionne bien, la conservation des données à partir de différents éléments de la liste imbriquée séparés:

# A tibble: 6 × 4 
    num let Name lett 
    <int> <chr> <chr> <chr> 
1  1  a  a <NA> 
2  2  b  a <NA> 
3  3  c  a <NA> 
4 101 <NA>  b  d 
5 102 <NA>  b  e 
6 103 <NA>  b  f