web-dev-qa-db-fra.com

Convertir une liste de vecteurs en trame de données

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?

17
Nick

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))
21
h3rm4n

Aussi Reduce:

Reduce(rbind, vectorList)

    # number square root
# init      1    1.000000
          # 2    1.414214
          # 3    1.732051
          # 4    2.000000
          # 5    2.236068
6
989

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.

1
Artem Sokolov