为什么在将rownames更改为相同时,相同的数据帧会变得不同

Nic*_*icE 3 r dataframe rowname

在玩一些数据帧时,我遇到了一种奇怪的行为:当我创建两个相同的数据帧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
Run Code Online (Sandbox Code Playgroud)

任何人都可以复制/解释原因吗?

jor*_*ran 6

这无疑是有点令人困惑的.从?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"
Run Code Online (Sandbox Code Playgroud)

但是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"
Run Code Online (Sandbox Code Playgroud)