53

以下函数对是否产生完全相同的结果?

对 1) names()&colnames()

对 2) rownames()&row.names()

4

4 回答 4

79

正如奥斯卡王尔德所说

一致性是缺乏想象力的最后避难所。

R 更像是一种进化而不是设计的语言,所以这些事情发生了。names()colnames()处理 adata.framenames()不适用于矩阵:

R> DF <- data.frame(foo=1:3, bar=LETTERS[1:3])
R> names(DF)
[1] "foo" "bar"
R> colnames(DF)
[1] "foo" "bar"
R> M <- matrix(1:9, ncol=3, dimnames=list(1:3, c("alpha","beta","gamma")))
R> names(M)
NULL
R> colnames(M)
[1] "alpha" "beta"  "gamma"
R> 
于 2010-02-17T14:53:19.670 回答
8

稍微扩展一下 Dirk 的示例:

将数据框视为具有相等长度向量的列表会有所帮助。这可能就是为什么names使用数据框而不是矩阵的原因。

另一个有用的函数是dimnames返回每个维度的名称。您会注意到该rownames函数实际上只是从dimnames.

关于rownamesand row.names:我无法区分,尽管rownames使用dimnameswhilerow.names是在 R 之外编写的。它们似乎也适用于高维数组:

>a <- array(1:5, 1:4)
> a[1,,,]
> rownames(a) <- "a"
> row.names(a)
[1] "a"
> a
, , 1, 1    
  [,1] [,2]
a    1    2

> dimnames(a)
[[1]]
[1] "a"

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL
于 2010-02-17T15:09:30.740 回答
5

我认为使用colnamesandrownames最有意义;这就是为什么。

使用names有几个缺点。你必须记住它的意思是“列名”,它只适用于数据框,所以你需要colnames在使用矩阵时调用。通过调用colnames,您只需要记住一个函数。最后,如果您查看 的代码colnames,您会发现它names无论如何都会在数据帧的情况下调用,因此输出是相同的。

rownamesrow.names为数据框和矩阵返回相同的值;我发现的唯一区别是,在没有任何名称的情况下,rownames将打印“NULL”(就像那样colnames),但row.names不可见地返回它。由于这两个功能之间没有太多选择,rownames以美学为由取胜,因为它与colnames. (另外,对于懒惰的程序员,你节省了一个打字字符。)

于 2010-02-17T15:35:37.960 回答
2

另一个扩展:

# create dummy matrix
set.seed(10)
m <- matrix(round(runif(25, 1, 5)), 5)
d <- as.data.frame(m)

如果要分配新的列名,可以执行以下操作data.frame

# an identical effect can be achieved with colnames()   
names(d) <- LETTERS[1:5]
> d
  A B C D E
1 3 2 4 3 4
2 2 2 3 1 3
3 3 2 1 2 4
4 4 3 3 3 2
5 1 3 2 4 3

但是,如果您在 上运行上一个命令matrix,您会搞砸的:

names(m) <- LETTERS[1:5]
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    2    4    3    4
[2,]    2    2    3    1    3
[3,]    3    2    1    2    4
[4,]    4    3    3    3    2
[5,]    1    3    2    4    3
attr(,"names")
 [1] "A" "B" "C" "D" "E" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
[20] NA  NA  NA  NA  NA  NA 

由于矩阵可以被视为二维向量,因此您只需将名称分配给前五个值(您不想这样做,是吗?)。在这种情况下,您应该坚持使用colnames().

所以那里...

于 2010-02-17T18:40:52.307 回答