行名称& R

中的列名 以下函数对是否生成完全相同的结果? 对1)
names()
&
colnames()
对2)
rownames()
&
row.names()
    
已邀请:
正如奥斯卡王尔德所说   一致性是最后的避难所   缺乏想象力。 R更像是一种进化而非设计的语言,所以这些事情发生了。
names()
colnames()
适用于
data.frame
names()
不适用于矩阵:
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> 
    
只是为了扩展Dirk的例子: 将数据帧视为具有相等长度向量的列表是有帮助的。这可能就是为什么
names
适用于数据框而不是矩阵。 另一个有用的功能是
dimnames
,它返回每个维度的名称。您会注意到
rownames
函数实际上只返回
dimnames
中的第一个元素。 关于
rownames
row.names
:我不能区分,虽然
rownames
使用
dimnames
row.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
    
我认为使用
colnames
rownames
是最有意义的;这就是原因。 使用
names
有几个缺点。你必须记住它意味着“列名”,它只适用于数据框,因此每当你使用矩阵时你都需要调用
colnames
。通过调用
colnames
,您只需要记住一个功能。最后,如果你看一下
colnames
的代码,无论如何你会看到它在数据帧的情况下调用
names
,所以输出是相同的。
rownames
row.names
为数据帧和矩阵返回相同的值;我发现的唯一区别是,如果没有任何名字,
rownames
将打印“NULL”(
colnames
),但
row.names
将无形地返回。由于在这两个功能之间没有太多可供选择,因此
rownames
以美学为基础获胜,因为它与ѭѭ更加巧妙地配对。 (另外,对于懒惰的程序员,您可以保存输入的字符。)     
另一个扩展:
# 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()
。 所以......     

要回复问题请先登录注册