R中的行名称和列名称

下面的函数对产生完全相同的结果吗?

Pair 1) names()colnames()

对2) row.names()row.names()

正如奥斯卡·王尔德所说

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

R更多的是一种进化而非devise的语言,所以这些事情就会发生。 names()colnames()data.frame上工作,但names()不能在matrix上工作:

 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的例子稍微扩展一下:

这有助于将dataframe视为具有相等长度向量的列表。 这可能是为什么names与数据框一起工作,而不是一个matrix。

另一个有用的函数是dimnames ,它返回每个维度的名称。 你会注意到dimnames函数实际上只是返回dimnames的第一个元素。

关于row.namesrow.names :虽然dimnames使用dimnamesrow.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 

我认为使用colnamescolnames是最有意义的。 这是为什么。

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

row.namesrow.names为数据框和matrix返回相同的值; 我发现的唯一区别是,在没有任何名称的情况下, rownames将打印“NULL”(与colnames ),但是row.names将不可row.names返回它。 由于这两个function之间没有太多的select, colnames以美学为基础获胜,因为它与colnames更为colnames 。 (另外,对于懒惰的程序员,你保存了一个input字符。)

另一个扩展:

 # 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 ABCDE 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 

由于matrix可以被视为二维vector,所以你只能给前五个值赋上名字(你不想这样做,是吗?)。 在这种情况下,你应该坚持使用colnames()

所以那里…

Interesting Posts