R all.equal中可能存在的错误

Igo*_*gor 4 r

我在R的all.equal函数中遇到了一些奇怪的行为.基本上,我以不同方式创建两个相同的data.frames,然后调用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)
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我错过了一些东西?我对all.equall函数做了很多调试,看起来问题是data.frames的rownames(一旦它们成为一个字符,另一次是数字向量).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
Run Code Online (Sandbox Code Playgroud)

如果有人能对此有所了解,我将不胜感激.

42-*_*42- 11

(我不清楚你认为你发现了什么错误.数据框架的创建方式不同.)var.a和var.b的结构有两个不同之处:元素的模式在列:numeric'var.a'和integer'var.b'; 以及integerrownames 的模式:对于'var.a'和character'var.b':

> dput(var.b)
structure(list(C1 = c(1L, 5L, 9L), C2 = c(1L, 5L, 9L)), .Names = c("C1", 
"C2"), row.names = c(1L, 5L, 9L), class = "data.frame")
> dput(var.a)
structure(list(C1 = c(1, 5, 9), C2 = c(1, 5, 9)), .Names = c("C1", 
"C2"), row.names = c("1", "5", "9"), class = "data.frame")

> mode(attr(var.b, "row.names"))
[1] "numeric"
> storage.mode(attr(var.b, "row.names"))
[1] "integer"
> mode(attr(var.a, "row.names"))
[1] "character"
Run Code Online (Sandbox Code Playgroud)

添加注释:如果要检查数字相等性,应使用'check.attributes'开关:

> all.equal(var.a, var.b, check.attributes=FALSE)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

如果你看一下var.bdput,你可以看到rownames是数字:

> dput(var.b)
structure(list(C1 = c(1L, 5L, 9L), C2 = c(1L, 5L, 9L)), .Names = c("C1", 
"C2"), row.names = c(1L, 5L, 9L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

  • +10 - 对于字符/整数更改,row.names的帮助非常清楚. (2认同)