行名称& R中的列名

时间:2010-02-17 14:20:08

标签: r columnname rowname

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

配对1)names()& colnames()

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

4 个答案:

答案 0 :(得分:69)

正如奥斯卡王尔德所说

  

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

R更像是一种进化而非设计的语言,所以这些事情发生了。 names()colnames()工作data.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> 

答案 1 :(得分:8)

只是为了扩展Dirk的例子:

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

另一个有用的函数是dimnames,它返回每个维度的名称。您会注意到rownames函数实际上只返回{​​{1}}中的第一个元素。

关于dimnamesrownames:虽然row.names使用rownamesdimnames是在R外写的,但我无法区分它们。似乎也适用于更高维数组:

row.names

答案 2 :(得分:5)

我认为使用colnamesrownames最有意义;这就是原因。

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

rownamesrow.names返回数据框和矩阵的相同值;我发现的唯一区别是,在没有任何名称的情况下,rownames将打印“NULL”(与colnames一样),但row.names将无形地返回。由于在这两个函数之间没有太多选择,rownames在美学的基础上获胜,因为它与colnames更好地配对。 (另外,对于懒惰的程序员,你可以保存输入的字符。)

答案 3 :(得分: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()

所以......