web-dev-qa-db-ja.com

名前とcolnamesの違いは何ですか

data.frameを操作するときに、namescolnamesの間に違いがあるかどうかを理解したいだけです。どちらも同じように動作するようです。代替することはできますか?

27
Manu H

それらはdata.framesでも同じですか? [〜#〜]はい[〜#〜]

それらは一般的に同じですか?完全ではありません-大きな違いは、colnamesmatricesでも機能するのに対し、namesは機能することですそうではありません(dataframes)。

さらに、cannamesを使用して、ベクトルの名前を設定/取得できます(そして、明らかな理由で、次のことができます。これをcolnames-で実行すると、取得の結果はNULLになり、設定のエラーになります)。

20
Steve S

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
    }
(...)

データフレームの場合、colnamesnames関数を呼び出すだけであることがわかります。そうです、それらは厳密に同等です。

9
juba

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.temp_でnames()を使用します

_> 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      
_

ここでは、実際に_names.temp_の5番目の名前属性を呼び出すことができます。

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

2番目のオブジェクトで繰り返しますが、今回は_colnames.temp_オブジェクトを作成します。

_> colnames.temp <- temp
_

_colnames.temp_でcolnames()を使用します

_> 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" ...
_
3
n00b by nature

私に関する限り、_data.frame_入力に関するnames()colnames()の唯一の違いは、メモリの割り当てがわずかに異なることです。たとえば、以下のコードチャンクについて考えてみます。

_    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()呼び出し中に1回だけ発生するのに対し、dfのコピーはcolnames()呼び出し。

1
francisav0