3
votes

Conversion d'une liste de listes en un bloc de données

J'ai une fonction qui génère d'abord une liste de vecteurs (générée en utilisant lapply), puis la lie à un vecteur colonne. Je pensais que cela produirait un dataframe. Cependant, il produit une liste de listes.

La fonction cbind ne fonctionne pas comme je le pensais.

Voici un petit exemple de ce que la fonction génère

     [,1] [,2] [,3] [,4]
[1,] 1    1    2    3

[2,] 2    2    2    2

[3,] 1    1    1    2

[4,] 1    1    2    2

[5,] 2    1    1    1

Taper

$`col_test`
[1] 1

$lst_test
[1] 1 2 3

donne la sortie

> a_df[1,]

Je voudrais que le bloc de données soit

col_test <- c(1, 2, 1, 1, 2)
lst_test <- list(c(1, 2 , 3), c(2, 2, 2), c(1, 1, 2), c(1, 2, 2), c(1, 1, 1))
a_df <- cbind(col_test, lst_test)


0 commentaires

4 Réponses :


0
votes

Cela devrait faire l'affaire. Notez que nous utilisons do.call pour que les éléments individuels de lst_test soient envoyés en tant que paramètres à cbind , ce qui empêche cbind de la création d'une liste de listes. t est utilisé pour transposer la matrice résultante dans votre orientation préférée, et enfin, un autre cbind avec col_test insère également ces données.

library(tidyverse)

mat.new <- do.call(cbind, lst_test) %>% 
  t %>% 
  cbind(col_test, .) %>% 
  unname

     [,1] [,2] [,3] [,4]
[1,]    1    1    2    3
[2,]    2    2    2    2
[3,]    1    1    1    2
[4,]    1    1    2    2
[5,]    2    1    1    1


1 commentaires

Je vous remercie. J'ai choisi d'utiliser le code dans la réponse de xenopus, car c'est un peu plus intuitif pour moi. Mais je garderai cela à l'esprit pour référence future.



1
votes
data.frame(col_test,t(as.data.frame(lst_test)))

0 commentaires

1
votes
do.call(rbind, Map(c, col_test, lst_test))
#     [,1] [,2] [,3] [,4]
#[1,]    1    1    2    3
#[2,]    2    2    2    2
#[3,]    1    1    1    2
#[4,]    1    1    2    2
#[5,]    2    1    1    1

0 commentaires

1
votes
  col_test V1 V2 V3
1        1  1  2  3
2        2  2  2  2
3        1  1  1  2
4        1  1  2  2
5        2  1  1  1

1 commentaires

Merci beaucoup. J'ai réussi à générer un df à partir de la réponse de xenopus, mais les noms de lignes étaient bizarres. Cette réponse m'a donc aidé à contourner ce problème.