使用某些数据框时,我遇到了一个奇怪的行为:当我创建两个相同的数据框a,b,然后交换它们的行名时,它们的输出结果并不相同:

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


谁能复制/解释为什么?

最佳答案

诚然,这有点令人困惑。从?data.frame开始,我们看到:


如果row.names提供为NULL或找不到合适的组件
行名称是从1开始的整数序列(此类行
名称被认为是“自动的”,并且不保留
as.matrix)。


因此,最初ab分别具有一个称为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"

09-03 18:21