2015-12-04 7 views
0

J'ai une structure de données et j'ai besoin d'ajouter un suffixe à certains noms de variables. Dans mon cas, il s'agit de toutes les variables numériques après la propagation d'une variable au format large. Quelqu'un pourrait-il me expliquer pourquoi la première option ne fonctionne pas, mais le second fait:Deux façons apparemment égales de changer les noms des colonnes pour R data.frame - seul l'autre fonctionne

df <- data.frame(ID = "id", var1 = 1, var2 = 2, var3 = 3) 

1.

colnames(df[,2:ncol(df)]) <- paste0(names(df[,2:ncol(df)]), "_X") 

2.

colnames(df) <- c("ID", paste0(names(df[,2:ncol(df)]), "_X")) 

Répondre

1

Vous df votre sous-ensembles, en substance créant une deuxième data.frame, et le renommer. Cela ne reflète pas sur votre data.frame original.

colnames(df[,2:ncol(df)]) <- paste0(names(df[, 2:ncol(df)]), "_X") 

serait égal à

df2 <- df[,2:ncol(df)] 
colnames(df2) <- paste0(names(df[, 2:ncol(df)]), "_X") 

> df 
    ID var1 var2 var3 
1 id 1 2 3 
> df2 
    var1_X var2_X var3_X 
1  1  2  3 

La manière correcte serait

colnames(df)[2:ncol(df)] <- paste0(names(df[, 2:ncol(df)]), "_X") 

ou en utilisant sprintf

colnames(df)[2:ncol(df)] <- sprintf("%s_X", names(df)[2:ncol(df)]) 
2

Votre commande poing contient des erreurs de syntaxe. Nous pouvons le réparer à:

colnames(df[,2:ncol(df)]) <- paste0(names(df[,2:ncol(df)]), "_X") 

Cela ne retourne pas une erreur, mais ne fonctionne toujours pas. Vous affectez des noms de colonnes à un sous-ensemble d'un data.frame, mais ce sous-ensemble n'est jamais stocké et la commande ne modifie pas les noms du fichier data.frame complet.

Vous devez attribuer à un sous-ensemble des noms:

colnames(df)[2:ncol(df)] <- paste0(names(df)[2:ncol(df)], "_X")