8
votes

R: remplacer les valeurs dans la liste imbriquée

suppose que nous avons une liste imbriquée: xxx

Comment remplacer toutes les valeurs null avec, disons, na pour préserver le Structure des données? Pour que je ne finisse pas de perdre des valeurs / une structure lorsque j'essaie de rendre la trame de données hors de la liste. Comme: xxx

la sortie souhaitée est quelque chose comme: xxx

Il y a des suggestions pour le faire de cette façon: xxx

qui n'est pas aussi vectorialisé que je voudrais. De toute évidence, la taille et la performance sont un problème. Une solution de contournement qui apparaît à l'esprit remplace toutes les valeurs nulles de la même manière que cela peut être effectuée pour la trame de données complète à la fois. Et ensuite Unlist () et matrice () la liste.

Je ne suis pas sûr du gain de la performance (s'il n'y en a pas à tous). Peut-être bon vieux Lapply () n'est-ce pas si mauvais.

r

3 commentaires

Pour remplacer les valeurs nulles dans toute la liste, nous devons accéder aux éléments à l'intérieur. Utilisation de Data.Table 1.9.5 Vous pouvez utiliser rbindlist (intitulé (.....), remplir = vrai) dans votre code mis à jour.


..Quelles appellent des appels à la fabrique et finissent essentiellement avec la même performance que votre réponse originale?


Je n'ai pas vérifié les points de repère, mais je pense que RBindlist serait plus rapide.


4 Réponses :


4
votes

Nous pouvons utiliser stri_list2matrix xxx

ceci pourrait être converti en data.frame xxx


5 commentaires

Juste curieux - existe-t-il une option pour remplacer les valeurs, au lieu d'appliquer des fonctions en forme de boucle? Il existe d'autres options telles que rbind.all dans data.table package ... il atteint le résultat mais l'itinéraire n'est pas tout à fait que je m'attendais.


Après quelques tests sur différents cas, cela semble être une approche la plus universelle.


@ A.Val. Avez-vous essayé des points de repère en utilisant cette méthode et le rbindlist


Cela fonctionnerait-il toujours si ma liste imbriquée a des types de vecteurs mixtes? (J'ai des doubles, des caractères et des listes dans ma liste ...)


@Mago sans connaître la structure, il est difficile de dire. Pourriez-vous poster comme nouvelle question



1
votes

Si vous savez que c'est juste une liste de deux niveaux, vous pouvez parcourir chaque élément en utilisant deux tests de boucles pour is.NULL . XXX

EDIT: Alors bien sûr, faites ce que vous faisiez avant.


1 commentaires

La boucle est une réponse évidente que je souhaite éviter à tout prix, je devrais probablement élargir ma question un peu à clarifier.



2
votes

Réponses suivantes trouvées ici , voici un (bit tordu ) façon d'aller dans base r : xxx


1 commentaires

@Colonelbeauvel, merci, Allez le seul crédit que j'ai ici est d'avoir trouvé le droit de la page ;-)



0
votes

une approche différente via dput code> et dget code> et le presse-papier.

test <- list(
  list(a = 1, b = 2, c = NULL),
  list(a = NULL, b = 2, c = 3))

dput(test,file="clipboard-1024")
tmp=dget(textConnection(gsub("NULL","NA",readChar(con="clipboard-1024",file.info("clipboard-1024")$size))))
data.frame(matrix(unlist(tmp), nrow = 2, byrow = T))

#  X1 X2 X3
#1  1  2 NA
#2 NA  2  3


0 commentaires