2017-08-14 1 views
2

Considérons une liste imbriquée avec des données essentiellement rectangulaires.Liste imbriquée dans le bloc de données et retour à la liste imbriquée

mylst1 <- list(
    "system" = list(
    "subjectId" = c(101,102,103), 
    "procedureId" = c(202,202,203) 
), 
    "demographics" = list(
    "demo_age" = c(12,22,32), 
    "demo_gender" = c(1,0,1) 
), 
    "items" = list(
    "N" = list(
     "n001" = c(1,2,3), 
     "n002" = c(3,2,1) 
    ), 
    "E" = list(
     "e001" = c(1,2,3), 
     "e002" = c(3,2,1) 
    ) 
) 
) 

Puisque les listes imbriquées sont difficiles à travailler, nous allons créer une trame de données: myDf <- data.frame(mylst1)

Jusqu'à présent, si bon, maintenant je peux effectuer toutes mes opérations sur myDf. Supposons que je viens de filtrer quelques observations. Le problème est que je dois retourner la même structure de liste imbriquée tel que requis par l'application Web que je veux envoyer ces données, mais maintenant les données bien sûr ressemble à ceci:

> str(myDf)  
'data.frame': 3 obs. of 8 variables: 
    $ system.subjectId  : num 101 102 103 
    $ system.procedureId  : num 202 202 203 
    $ demographics.demo_age : num 12 22 32 
    $ demographics.demo_gender: num 1 0 1 
    $ items.N.n001   : num 1 2 3 
    $ items.N.n002   : num 3 2 1 
    $ items.E.e001   : num 1 2 3 
    $ items.E.e002   : num 3 2 1 

Quelle serait la meilleure solution obtenir ces données dans le format de la liste d'origine? Je pensais utiliser le . comme délimiteur pour chaque niveau, mais je ne sais pas comment le faire en pratique.

Merci

Répondre

3

Une option serait relist (en supposant que les colonnes sont tous du même class) comme dans le « myDf »

newlst <- relist(unlist(myDf), skeleton = mylst1) 
identical(mylst1, newlst) 
#[1] TRUE 
+2

Une mise en garde importante (je crois) est que le nombre de les éléments de myDF ne peuvent pas changer (aucune ligne ajoutée ou supprimée). Un deuxième problème potentiel est que 'unlist' va contraindre tous les éléments au même type. – lmo

+0

@lmo Ouais c'est vrai, et j'ai ajouté l'hypothèse à propos de la même classe – akrun

+0

Merci! Je ne connaissais pas 'relist()'! Comme l'a fait remarquer lmo, le problème est que je ne peux pas ajouter ou supprimer des cas. Y a-t-il un travail ici? –