Comment changer les noms de colonnes dans le bloc de données dans R? [fermé]

9
 names(mydat)[c(name)]<-c("newname") 

De cela, je sais que le nom de colonne / variable "nom" de la trame de données mydat est remplacé par "nouveau nom".

Ma question est de savoir si, je veux le faire par une boucle afin d'avoir quelque chose comme:

newname1 newname2 newname3 newname4 et ainsi de suite, comment faire?

C'est ce qui a fonctionné et n'a pas fonctionné:

for(i in 1:4){
names(mydat)[c(name)]<-c("newname"i)
}

Existe-t-il un moyen de coder cela? un grand merci à tous ceux qui pourraient être utiles. Owusu Isaac

Fils
la source
4
Cette question semble être hors sujet car elle concerne uniquement la programmation.
gung - Rétablir Monica
Si vous devez renommer des noms de variables moches (par exemple, abcde_1_1, abcde_2_2, abcde_3_3 ...) comme cela se produit fréquemment dans certains jeux de données téléchargés depuis Qualtrics: ugly_vars <- names(dplyr::select(df, starts_with("abcde_"))) names(ESM_df[ugly_vars]) <- str_c("abc_", 1:length(ugly_vars))
JetLag

Réponses:

10

La solution la plus évidente serait de changer votre code dans la boucle for avec ce qui suit:

   names(mydat)[c(name)] <- paste("newname",i,sep="")

Mais vous devez clarifier votre variable name. Pour le moment, cette boucle fera 4 renommages de la colonne unique.

En général, si les noms que vous souhaitez modifier sont vectoriels, il s'agit d'une procédure de sous-ensemble standard:

 names(mydat)[names(mydat)%in% names_to_be_changed] <- name_changes
mpiktas
la source
Bonjour Mpiktas, votre solution fonctionne parfaitement. Merci beaucoup. et merci à tous aussi
Fils
1
@Owusu, l'expression de gratitude dans ce site est un vote positif des réponses et de leur acceptation. Voir la FAQ . Quoi qu'il en soit, heureux d'être utile.
mpiktas
6

Essayez d'utiliser sprintfou paste, comme ceci:

names(mydat)<-sprintf("name%d",1:10)

Notez également que le names(mydat)[c(name)]est plus ou moins un non-sens; c(name)équivaut à écrire juste nameet signifie "obtenir la valeur de la variable appelée name'; le crochet extraira au moins les éléments de names(mydat)mais uniquement si la namevariable contient un index numérique ou booléen.

Si vous souhaitez remplacer les colonnes appelées namepar name1, name2, ..., nameN, utilisez quelque chose comme ceci:

names(mydat)[names(mydat)=="name"]<-sprintf("name%d",1:sum(names(mydat)=="name"))

EDIT: Eh bien, si vous souhaitez simplement supprimer les noms de colonnes en double, il existe un moyen encore plus simple; R a une make.namesfonction qui résout ce problème; il peut être utilisé comme ceci:

names(mydat)<-make.names(names(mydat),unique=TRUE)

Encore plus court, le même ne peut être obtenu qu'en écrivant:

data.frame(mydat)->mydat #The magic is in check.names, but it is TRUE by default

la source
@mbq, == fait une correspondance partielle pour les chaînes?
mpiktas
@mpiktas Non, mais seule une correspondance exacte est nécessaire ici. greplserait OK pour faire le travail plus général.
@mbq, oui mais cela suppose qu'il y a plusieurs colonnes avec le même nom. R le permet, mais j'essaie d'éviter d'utiliser cette fonctionnalité.
mpiktas
@mpiktas Apparemment, l'OP aussi, d'où cette question.
@mbq merci d'avoir clarifié la confusion avec les noms (mydat) [c (nom)] Depuis que l'OP a écrit je sais que la colonne / variable nom "nom" je me disais "wow c'est possible?" et a essayé d'accéder aux noms par leur nom ... stupide moi;). Puis-je humblement suggérer de modifier la question?
steffen
5

J'ai eu le même problème et je l'ai résolu avec ce code:

names(mydat) <- paste("newname", 1:ncol(mydat), sep="");
cuong
la source