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.
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.
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
plyr
a une fonction de changement de nom uniquement dans ce but:
library(plyr)
mydf <- rename(mydf, c("MyName.1" = "MyNewName"))
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
.
Vous pouvez utiliser la fonction str_replace
du stringr package:
names(mydf) <- str_replace(names(mydf), "MyName.1", "MyNewName")