data.frame
を操作するときに、names
とcolnames
の間に違いがあるかどうかを理解したいだけです。どちらも同じように動作するようです。代替することはできますか?
それらはdata.framesでも同じですか? [〜#〜]はい[〜#〜]
それらは一般的に同じですか?完全ではありません-大きな違いは、colnamesはmatricesでも機能するのに対し、namesは機能することですそうではありません(dataframes)。
さらに、canはnamesを使用して、ベクトルの名前を設定/取得できます(そして、明らかな理由で、次のことができます。これをcolnames-で実行すると、取得の結果はNULLになり、設定のエラーになります)。
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
関数を呼び出すだけであることがわかります。そうです、それらは厳密に同等です。
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" ...
_
私に関する限り、_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()
呼び出し。