在玩一些数据帧时,我遇到了一个奇怪的行为:当我创建两个相同的数据帧a,b
,然后交换他们的rownames时,它们并不相同:
rm(list=ls())
a <- data.frame(a=c(1,2,3),b=c(2,3,4))
b <- a
identical(a,b)
#TRUE
identical(rownames(a),rownames(b))
#TRUE
rownames(b) <- rownames(a)
identical(a,b)
#FALSE
任何人都可以复制/解释原因吗?
答案 0 :(得分:6)
这无疑令人困惑。从?data.frame
开始,我们看到:
如果row.names提供为NULL或找不到合适的组件 行名是从1开始的整数序列(和这样的行) 名称被认为是“自动的”,而不是由...保留 as.matrix)。
所以最初a
和b
每个都有一个名为row.names
的属性,它们是整数:
> str(attributes(a))
List of 3
$ names : chr [1:2] "a" "b"
$ row.names: int [1:3] 1 2 3
$ class : chr "data.frame"
但是rownames()
返回一个字符向量(就像dimnames()
一样,实际上是一个字符向量列表,在引擎盖下调用)。因此,在重新分配行名称后,您最终得到:
> str(attributes(b))
List of 3
$ names : chr [1:2] "a" "b"
$ row.names: chr [1:3] "1" "2" "3"
$ class : chr "data.frame"