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.names
和row.names
:虽然dimnames
使用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
和colnames
是最有意义的。 这是为什么。
使用names
有几个缺点。 你必须记住,它意味着“列名”,它只适用于数据框架,所以你需要调用colnames
每当你使用matrix。 通过调用colnames
,你只需要记住一个函数。 最后,如果您查看colnames
的代码,您将会看到它在数据框架的情况下调用names
,因此输出是相同的。
row.names
和row.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()
。
所以那里…