J'ai une question triviale: je n'ai pas pu trouver une structure de données de dictionnaire dans R, donc j'ai utilisé la liste à la place (comme "mot" -> nombre) Donc, en ce moment, j'ai un problème pour obtenir la liste des clés. Quelqu'un le sait?
89
environment
type est utilisé pour cela dans R, mais il est moins courant / moins connu.Vous n'avez même pas besoin de listes si vos valeurs «numériques» sont toutes du même mode. Si je prends l'exemple de Dirk Eddelbuettel:
Les listes ne sont requises que si vos valeurs sont soit en mode mixte (par exemple, caractères et nombres), soit en vecteurs.
Pour les listes et les vecteurs, un élément individuel peut être sous-défini par son nom:
Ou pour une liste:
la source
c(12,22,33)
de cette structure R de style dictionnaire foo?unlist(lapply(FUN=function(a){foo[[a]]},X = 1:length(foo)))
est très gênant. Une fonction prête pour cela? Déplacement de la question iciPour étendre un peu la réponse de Calimo, je présente quelques autres choses que vous pourriez trouver utiles lors de la création de ce quasi dictionnaires en R:
a) comment retourner toutes les VALEURS du dictionnaire:
b) vérifier si le dictionnaire CONTIENT UNE CLÉ:
c) comment ajouter une nouvelle clé, une paire de valeurs au dictionnaire:
résultats:
d) comment remplir l'exigence du VRAI DICTIONNAIRE - que les clés NE PEUVENT PAS se répéter (CLÉS UNIQUES)? Vous devez combiner b) et c) et construire une fonction qui valide s'il existe une telle clé, et faire ce que vous voulez: par exemple, ne pas autoriser l'insertion, mettre à jour la valeur si la nouvelle est différente de l'ancienne, ou reconstruire d'une manière ou d'une autre la clé (par exemple ajoute un certain nombre pour qu'il soit unique)
e) comment SUPPRIMER la paire PAR CLÉ du dictionnaire:
la source
c(foo, tic2=NULL)
. Un travail autour?La raison de l'utilisation des dictionnaires en premier lieu est la performance. Bien qu'il soit correct que vous puissiez utiliser des vecteurs et des listes nommés pour la tâche, le problème est qu'ils deviennent assez lents et gourmands en mémoire avec plus de données.
Pourtant, ce que beaucoup de gens ne savent pas, c'est que R a en effet une structure de données de dictionnaire intégrée: des environnements avec l'option
hash = TRUE
Consultez l'exemple suivant pour savoir comment le faire fonctionner:
Edit : Sur la base de cette réponse, j'ai écrit un article de blog avec un peu plus de contexte: http://blog.ephorie.de/hash-me-if-you-can
la source
Le hachage du package est maintenant disponible: https://cran.r-project.org/web/packages/hash/hash.pdf
Exemples
la source
Variation plus courte de la réponse de Dirk:
la source
Je vais juste commenter que vous pouvez gagner beaucoup de temps
table
lorsque vous essayez de "falsifier" un dictionnaire également, par exempleetc.
la source
as.numeric()
soit nécessaire. Le tableau est déjà numérique. Vous pouvez obtenir le même résultat avecnames(t[order(t)])