2010-09-21 6 views
2

J'ai une question sur la fonction colnames dans le package de basecolnames Affectation() à la colonne spécifique d'une trame de données

Disons que vous avez un data.frame, comme suit:

df <- data.frame(variable = letters[1:100], value = rnorm(100)) 

Comme on pourrait s'attendre, colnames(df[1]) retours:

colnames(df[1]) 
# [1] "variable" 

Cependant, il ne semble pas que l'affectation est possible lorsque vous appelez une colonne spécifique

colnames(df[1]) <- c("test") 
colnames(df[1]) 
# [1] "variable" 

Pourquoi est-ce?

Répondre

3

La raison pour laquelle votre version ne fait pas ce que vous attendez est que df[1] crée une trame de données temporaire en mémoire, la fonction colnames change alors le nom de la colonne 1 dans ce cadre de données temporaire (pas votre cadre de données d'origine), mais rien d'autre n'est fait avec le temporaire df donc il est jeté silencieusement. Votre cadre de données d'origine n'a jamais été touché, donc la prochaine fois que vous faites colnames(df[1]) une nouvelle df temporaire est créée à partir de votre original non modifié et le nom de col est retourné. La modification de l'ordre d'appel colnames et le sous-ensemble font ce que vous voulez, comme le montrent les autres réponses.

+0

Merci! C'est le "pourquoi"! –

7

Parce que vous devez faire ceci:

> colnames(df)[1] <- "test" 
> colnames(df)[1] 
[1] "test" 

La fonction colnames retourne un vecteur de caractères qui peut être modifié.

2

Appelez le colnames() de fonction sur la trame de données (l'ensemble dataframe) puis accès par l'indexation, les éléments du vecteur 1D retourné par cet appel de fonction:

> data(Orange)  
> Orange[1:5,] 
    Tree age circumference 
1 1 118   30 
2 1 484   58 
3 1 664   87 
4 1 1004   115 
5 1 1231   120 
> call *colnames* on the Orange dataframe and bind it to the variable *cn* 
> cn = colnames(Orange) 
> cn  
[1] "Tree"   "age"   "circumference" 
> length(cn) 
[1] 3 
> class(cn) 
[1] "character" 

> # access the items of this 1D character vector by index: 
> cn[1] 
[1] "Tree" 
> cn[3] 
[1] "circumference" 
> # likewise modify any item the same way: 
> cn[3] = '2*pi*r' 
Questions connexes