Подтвердить что ты не робот

В чем разница между именами и именами кодов

Я просто хочу понять, существует ли разница между names и colnames при работе с data.frame. Оба, похоже, ведут себя одинаково. Могу ли я подписать один за другим?

4b9b3361

Ответ 1

Являются ли они одинаковыми для data.frames? Да

Они одинаковы в целом? Не совсем - большая разница в том, что colnames также работает для матриц, тогда как имена не используются (только для данных).

Кроме того, вы можете использовать имена, чтобы установить/получить имена векторов (и по очевидным причинам вы не можете сделать это с помощью colnames ). результатом является NULL для получения и ошибка для установки).

Ответ 2

Если вы посмотрите на начало исходных текстов функций colnames и colnames<-:

R> colnames
function (x, do.NULL = TRUE, prefix = "col") 
{
    if (is.data.frame(x) && do.NULL) 
        return(names(x))
(...)


R> `colnames<-`
function (x, value) 
{
    if (is.data.frame(x)) {
        names(x) <- value
    }
(...)

Вы можете видеть, что для фреймов данных colnames просто вызовите функцию names. Так что да, они строго эквивалентны.

Ответ 3

names() отображает атрибуты имени, где colnames() просто называет столбцы.

то есть.

Создайте временную переменную.

> temp <- rbind(cbind(1,2,3,4,5),
+               cbind(6,7,8,9,10))

> temp
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10

Создайте объект names.temp.

> names.temp <- temp

Используйте names() в names.temp

> names(names.temp) <- paste(c("First col", "Second col", "Third col",
 "Fourth Col", "Fifth col"))

> names.temp
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
attr(,"names")
 [1] "First col"  "Second col" "Third col"  "Fourth Col" "Fifth col"  
 NA NA NA          
 [9] NA NA      

Мы видим, что на самом деле мы можем назвать 5-й атрибут имени в names.temp.

> names(names.temp)[5]
[1] "Fifth col"    

Повторите со вторым объектом, но на этот раз создайте объект colnames.temp.

> colnames.temp <- temp

Используйте colnames() на colnames.temp

> colnames(colnames.temp) <- paste(c("First col", "Second col", "Third col",
 "Fourth Col", "Fifth col"))

> colnames.temp
     First col Second col Third col Fourth Col Fifth col
[1,]         1          2         3          4         5
[2,]         6          7         8          9        10

Теперь атрибут name имеет значение NULL.

> names(colnames.temp)[5]
NULL

НАКОНЕЦ. Давайте посмотрим на нашу надежную команду str(). Мы видим, что существует структурная разница между names.temp и colnames.temp. В частности, colnames.temp имеет атрибуты dimnames не атрибуты names.

> str(names.temp)
 num [1:2, 1:5] 1 6 2 7 3 8 4 9 5 10
 - attr(*, "names")= chr [1:10] "First col" "Second col" "Thrid col" "Fourth     
Col" ...
> str(colnames.temp)
 num [1:2, 1:5] 1 6 2 7 3 8 4 9 5 10
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:5] "First col" "Second col" "Thrid col" "Fourth Col" ...

Ответ 4

Насколько мне известно, единственная разница между names() и colnames() по отношению к входу data.frame заключается в том, что они выделяют память немного по-разному. Например, рассмотрите фрагмент кода ниже:

    df <- data.frame(x=1:5, y=6:10, z=11:15)
    tracemem(df)
    names(df) <- c("A", "B", "C")
    colnames(df) <- c('a','b','c') 

Если вы запустите этот код, вы увидите, что копирование df происходит только один раз во время вызова names(), тогда как копирование df происходит дважды во время вызова colnames().