Я столкнулся с некоторым странным поведением в функции all.equal R. По сути, я создаю два одинаковых кадра данных по-разному, а затем вызываю функцию 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 (когда они были символом, а в другой раз - числовым вектором). Ответ функции all.equall:
[1] "Атрибуты: ‹ Компонент 2: Режимы: символьный, числовой >"
[2] "Атрибуты: ‹ Компонент 2: цель – символ, текущий – число >"
Однако,
typeof(имена строк(var.a)) == typeof(имена строк(var.b))
возвращает TRUE, что меня смущает.
P.S.: Структура объектов одинакова:
> 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
Я был бы признателен, если бы кто-то мог пролить свет на это.