我只是想了解使用names
时colnames
和data.frame
之间是否存在差异。两者似乎都表现得一样。我可以替换另一个吗?
答案 0 :(得分:20)
对于data.frames它们是否相同?的是
它们一般是一样的吗? 不完全 - 最大的区别是 colnames 也适用于 matrices ,而名称则不适用(仅数据帧 )。
此外,您可以使用名称来设置/获取向量的名称(并且,由于显而易见的原因,您无法通过 colnames - 获取结果为NULL,设置错误。
答案 1 :(得分:9)
如果您查看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
函数即可。所以是的,它们完全相同。
答案 2 :(得分: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
我们在这里看到我们实际上可以在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" ...
答案 3 :(得分:1)
就我而言,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()
期间发生两次打电话。