2010-09-21 3 views
2

У меня есть вопрос о colnames функции в базовом пакетеНазначение COLNAMES() для конкретного столбца кадра данных

Допустим, у вас есть data.frame, следующим образом:

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

Как можно было бы ожидать, colnames(df[1]) возвращается:

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

Однако, это не кажется, что назначение возможно при вызове конкретного столбца

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

Почему?

ответ

3

Причина ваша версия не делает то, что вы ожидаете, так это то, что df[1] создает временный фрейм данных в памяти, функция colnames затем изменяет имя столбца 1 в этом временном фрейме данных (а не на вашем исходном фрейме данных), но затем ничего не делается с временным df, поэтому он молча отбрасывается. Ваш исходный фрейм данных никогда не касался, поэтому в следующий раз, когда вы делаете colnames(df[1]), новый временный df создается копированием из вашего неизмененного оригинала и возвращается имя colname.

Изменение порядка вызова colnames и подмножество делает то, что вы хотите, как показывают другие ответы.

+0

Спасибо! Это «почему»! –

7

Потому что вы должны делать это:

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

Функция COLNAMES возвращает вектор символов, который может быть изменен.

2

Вызовите COLNAMES() функция на dataframe (весь dataframe) затем доступ индексацию, элементы вектора 1D, возвращенного этой функцией вызова:

> 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' 
Смежные вопросы