10
votes

Renommer des colonnes dans plusieurs dataframes, r

J'essaie de renommer des colonnes de multiples data.frame s.

Pour donner un exemple, disons que j'ai une liste de data.frame s DFA , DFB et DFC . J'ai écrit une fonction Changenames pour définir les noms en conséquence, puis utilisé lapply comme suit: xxx

Cependant, cela ne " t Travailler comme prévu. Il semble que je n'atditais pas les nouveaux noms au data.frame , mais crée uniquement les nouveaux noms. Qu'est-ce que je fais mal ici?

Merci d'avance!


5 commentaires

Après la ligne noms (x) <- dans votre fonction, ajoutez retour (x) ou simplement x . D'autre, vous retournez juste noms (x) .


Merci pour votre réponse ARUN! Si je reviendrai (x), je recevrai une extillon de DFA, de DFB et de DFC, avec les nouveaux noms. Mais si je considère les noms (DFA), les noms (DFB) et les noms (DFC), ils ont toujours les anciens noms de colonne. Mes cadres de données sont également très importants, donc je ne suis donc pas intéressé à les regarder. Ne changeant que des noms de colonne.


Labayly ne modifie pas l'entrée. Il n'y a pas de "changement par référence" qui se passe ici. Tout est fait sur une copie. Vous devrez attribuer le résultat. FAIRE: DFS <- PApply (DFS, Changenames)


OK, DFS est maintenant une grande liste contenant DFA, DFB et DFC, avec les nouveaux noms de colonnes. Je suis toujours intéressé à travailler avec la DFA, DFB un DFC individuellement et individuellement, ils ont toujours les anciens noms de colonnes? Comment puis-je attribuer le résultat à la famille individuelle?


Eh bien, vous devriez les assigner. DFA <- DFS [[1]] ...?


3 Réponses :


14
votes

Il y a deux choses ici:

  • 1) Vous devez renvoyer la valeur souhaitée à partir de votre fonction. Sinon, la dernière valeur sera renvoyée. Dans votre cas, c'est noms (x) code>. Ainsi, vous devriez plutôt ajouter comme dernière ligne, retour (x) code> ou simplement x code>. Donc, votre fonction ressemblerait à: p> XXX PRE> LI>

  • 2) Labayly code> ne modifie pas vos objets d'entrée par référence. Cela fonctionne sur une copie. Donc, vous devrez attribuer les résultats. Ou une autre alternative consiste à utiliser for-boucles code> au lieu de lapply code>: p> XXX PRE> LI> ul>

    Même en utilisant le pour la boucle code>, vous effectuerez toujours une copie (car noms (.) fait). Vous pouvez vérifier cela en utilisant tracemem code>. P> xxx pré>

    Si vous souhaitez modifier par référence, vous pouvez utiliser datable.table code > Fonction SETNAMES CODE> FONCTION: P>

    df <- data.frame(x=1:5, y=6:10, z=11:15)
    require(data.table)
    tracemem(df)
    # [1] "<0x7f98ec76d7b0>"
    setnames(df, c("A", "B", "C"))
    tracemem(df)
    # [1] "<0x7f98ec76d7b0>"
    


1 commentaires

En utilisant cela comme fonction pour modifier les noms de colonne sur plusieurs cadres de données contenus dans une liste comme celle-ci était incroyablement utile. J'ai généralisé la fonction de prendre un deuxième et troisième argument et j'ai utilisé cela comme entrée pour un grep () pour modifier les noms de colonnes spécifiques dans toutes mes cadres de données.



11
votes

Si les données de données n'étaient pas dans une liste, mais simplement dans l'environnement global, vous pouvez les renvoyer à l'aide d'un vecteur de noms de chaîne. XXX PRE>

EDIT P> P> Simplifiez le code ci-dessus que vous pouvez utiliser P> xxx pré>

ou à l'aide de data.table code> qui ne nécessite pas de réaffectation. P>

for(df in c("dfA", "dfB"))
  data.table::setnames(get(df),  c("G", "H"))


0 commentaires

-1
votes

J'ai eu le problème de l'importation d'un ensemble de données public et de renommer chaque fichier de données et de renommer chaque colonne dans chaque fichier de données pour couper les succursales, les minuscules et les espaces internes avec des périodes.

Combinant les méthodes ci-dessus me a: < / p> xxx


0 commentaires