Rのall.equal関数で奇妙な動作に直面しました。基本的に、2つの同じdata.frameを異なる方法で作成してから、all.equal関数を呼び出します(データと属性もチェックします)。
動作を再現するためのコードは次のとおりです。
var.a <- data.frame(cbind(as.integer(c(1,5,9)), as.integer(c(1,5,9))))
colnames(var.a) <- c("C1", "C2")
rownames(var.a) <- c("1","5","9")
var.b <- data.frame(matrix(NA, nrow = 10, ncol = 2))
var.b[, 1] <- 1:10
var.b[, 2] <- 1:10
colnames(var.b) <- c("C1", "C2")
var.b <- var.b[seq(1, nrow(var.b), 4), ]
all.equal(var.a, var.b)
これはバグですか、それとも何かが足りないだけですか?all.equall関数のデバッグをかなり行いましたが、問題はdata.framesの行名にあるようです(1つは文字で、もう1つは数値ベクトルです)。all.equall関数の応答:
[1] "属性:<コンポーネント2:モード:文字、数値>"
[2] "属性:<コンポーネント2:ターゲットは文字、現在は数値>"
でも、
typeof(rownames(var.a))== typeof(rownames(var.b))
TRUEを返します。これは私を混乱させます。
PS:オブジェクトの構造は同じようです:
> str(var.a)
'data.frame': 3 obs. of 2 variables:
$ C1: int 1 5 9
$ C2: int 1 5 9
> str(var.b)
'data.frame': 3 obs. of 2 variables:
$ C1: int 1 5 9
$ C2: int 1 5 9
誰かがこれに光を当てることができれば幸いです。