web-dev-qa-db-fra.com

Renommer plusieurs colonnes de données, référencées par les noms actuels

Je souhaite renommer certaines colonnes aléatoires d'un cadre large data et je souhaite utiliser les noms de colonne actuels et non les index. Les index de colonnes pouvant changer si j'ajoute ou supprime des colonnes aux données, je me suis dit que l'utilisation des noms de colonnes existants est une solution plus stable ...

mydf = merge(df.1, df.2)
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName"

Puis-je simplifier ce code, que ce soit l'appel merge() d'origine ou simplement la deuxième ligne? "MyName.1" est en fait le résultat d'une xts merge de deux objets xts différents.

36
Robert Kubrick
names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" # 13 characters shorter. 

Bien que vous souhaitiez éventuellement remplacer un vecteur. Dans ce cas, utilisez %in% au lieu de == et définissez MyName.1 en tant que vecteur de longueur égale sur MyNewName.

25
Brandon Bertelsen

Le problème avec la modification des noms de colonne d'un data.frame est que, presque incroyablement, tout le data.frame est copié. Même lorsqu'il est dans .GlobalEnv et qu'aucune autre variable ne pointe dessus.

Le package data.table a une fonction setnames() qui modifie les noms de colonne par référence sans copier l'ensemble du jeu de données. data.table est différent en ce sens qu'il ne copie pas en écriture, ce qui peut être très important pour les grands ensembles de données. (Vous avez bien dit que votre ensemble de données était volumineux.) Indiquez simplement les noms old et new:

require(data.table)
setnames(DT,"MyName.1", "MyNewName")
# or more explicit:
setnames(DT, old = "MyName.1", new = "MyNewName")
?setnames
135
Matt Dowle

plyr a une fonction de changement de nom uniquement dans ce but:

library(plyr)
mydf <- rename(mydf, c("MyName.1" = "MyNewName"))
25
hadley
names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf))

Cela se généraliserait mieux en stratégie de changement de nom multiple si vous définissez un radical comme modèle à remplacer par gsub au lieu de sub.

4
42-

Vous pouvez utiliser la fonction str_replace du stringr package:

names(mydf) <- str_replace(names(mydf), "MyName.1", "MyNewName")
0
tfad334