J'essaie de convertir une liste de vecteurs (un tableau multidimensionnel essentiellement) en trame de données, mais chaque fois que j'essaie, j'obtiens des résultats inattendus.
Mon but est d'instancier une liste vide, de la remplir dans une boucle for avec des vecteurs contenant des informations sur cette itération de la boucle, puis de la convertir en trame de données une fois qu'elle est terminée.
> vectorList <- list()
> for(i in 1:5){
+ vectorList[[i]] <- c("number" = i, "square root" = sqrt(i))
+ }
> vectorList
Les sorties:
> [[1]]
> number square root
> 1 1
>
> [[2]]
> number square root
> 2.000000 1.414214
>
> [[3]]
> number square root
> 3.000000 1.732051
>
> [[4]]
> number square root
> 4 2
>
> [[5]]
> number square root
> 5.000000 2.236068
Maintenant, je veux que cela devienne une trame de données avec 5 observations de 2 variables, mais en essayant de créer une trame de données à partir de 'vectorList'
numbers <- data.frame(vectorList)
résultats dans 2 observations de 5 variables.
Bizarrement, reshape2 ne sera même pas contraint (ce qui serait un travail horrible, mais j'ai essayé).
Quelqu'un a un aperçu?
Vous pouvez utiliser:
as.data.frame(do.call(rbind, vectorList))
Ou:
library(data.table)
rbindlist(lapply(vectorList, as.data.frame.list))
Ou:
library(dplyr)
bind_rows(lapply(vectorList, as.data.frame.list))
Aussi Reduce
:
Reduce(rbind, vectorList)
# number square root
# init 1 1.000000
# 2 1.414214
# 3 1.732051
# 4 2.000000
# 5 2.236068
Une solution alternative utilisant purrr
:
purrr::map_dfr( vectorList, as.list )
# # A tibble: 5 x 2
# number `square root`
# <dbl> <dbl>
# 1 1 1
# 2 2 1.41
# 3 3 1.73
# 4 4 2
# 5 5 2.24
Le code convertit effectivement chaque vecteur en une liste et concatène les résultats par lignes dans un cadre de données commun.