名称和姓氏之间有什么区别

时间:2014-07-17 09:01:43

标签: r

我只是想了解使用namescolnamesdata.frame之间是否存在差异。两者似乎都表现得一样。我可以替换另一个吗?

4 个答案:

答案 0 :(得分:20)

对于data.frames它们是否相同?的

它们一般是一样的吗? 不完全 - 最大的区别是 colnames 也适用于 matrices ,而名称则不适用(仅数据帧 )。

此外,您可以使用名称来设置/获取向量的名称(并且,由于显而易见的原因,您无法通过 colnames - 获取结果为NULL,设置错误。

答案 1 :(得分:9)

如果您查看colnamescolnames<-函数源代码的开头:

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.tempcolnames.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()期间发生两次打电话。