Je voudrais transformer une liste comme ceci:Liste en Tibble utilisant des noms de la liste comme valeurs dans une colonne
l <- list(x = c(1, 2), y = c(3, 4, 5))
dans un Tibble comme ceci:
Name Value
x 1
x 2
y 3
y 4
y 5
Je voudrais transformer une liste comme ceci:Liste en Tibble utilisant des noms de la liste comme valeurs dans une colonne
l <- list(x = c(1, 2), y = c(3, 4, 5))
dans un Tibble comme ceci:
Name Value
x 1
x 2
y 3
y 4
y 5
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.
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
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