4

使用 R 时,我通常使用identical(a,b)检查对象ab是否相同。如果返回FALSE,我希望能够看到这些差异在哪里......是否有一个函数可以告诉我这个?

4

4 回答 4

5

您正在寻找 all.equal()

a <- data.frame(A = 1)
b <- data.frame(B = 1)
all.equal(a, b)

[1] "Names: 1 string mismatch"

d <- data.frame(B = 2)
all.equal(b, d)

"Component 1: Mean relative difference: 1"

all.equal(a, d)

[1] "Names: 1 string mismatch"                
[2] "Component 1: Mean relative difference: 1"
于 2012-10-15T08:04:21.660 回答
5

这并不能完全回答您的问题,但您可能也对“比较”包感兴趣。

特别是,allowAll=TRUE该函数有一个参数“”,compare()它似乎试图转换比较对象以匹配输入,它说明需要进行哪些转换以及对象是否相同。

首先,一些数据。“a”、“b”、“d”和“e”非常相似。

a <- data.frame(A = 1:10, B = LETTERS[1:10])
b <- data.frame(C = 1:10, B = LETTERS[1:10])
d <- data.frame(A = 1:10, B = letters[1:10])
e <- data.frame(A = 1:10, B = letters[1:10])
f <- data.frame(A = c(1, 3, 4, 5, 6, 7, 8, 11, 12, 13), 
                B = LETTERS[c(1, 3, 2, 4, 5, 6, 9, 8, 7, 10)])

现在,使用比较来查看它是否能够使数据相同。对于“b”、“d”和“e”,它能够应用某些变换使它们与“a”相同,但在比较“f”和“a”时却不能这样做。

(w <- compare(a, b, allowAll=TRUE))
# TRUE
#   renamed
#   dropped names
(x <- compare(a, d, allowAll=TRUE))
# TRUE 
#   [B] dropped attributes
(y <- compare(a, e, allowAll=TRUE))
# TRUE 
#   [B] dropped attributes
(z <- compare(a, f, allowAll=TRUE))
# FALSE [FALSE, FALSE]
#   [A] coerced from <numeric> to <integer>

您还可以查看有关比较对象的更多详细信息。

str(x)
# List of 8
#  $ result          : logi TRUE
#  $ detailedResult  : Named logi [1:2] TRUE TRUE
#   ..- attr(*, "names")= chr [1:2] "A" "B"
#  $ transform       : Named chr "[B] dropped attributes"
#   ..- attr(*, "names")= chr "B"
#  $ tM              :'data.frame':  10 obs. of  2 variables:
#   ..$ A: int [1:10] 1 2 3 4 5 6 7 8 9 10
#   ..$ B: int [1:10] 1 2 3 4 5 6 7 8 9 10
#  $ tC              :'data.frame': 10 obs. of  2 variables:
#   ..$ A: int [1:10] 1 2 3 4 5 6 7 8 9 10
#   ..$ B: int [1:10] 1 2 3 4 5 6 7 8 9 10
#  $ tMpartial       :'data.frame': 10 obs. of  2 variables:
#   ..$ A: int [1:10] 1 2 3 4 5 6 7 8 9 10
#   ..$ B: Factor w/ 10 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10
#  $ tCpartial       :'data.frame': 10 obs. of  2 variables:
#   ..$ A: int [1:10] 1 2 3 4 5 6 7 8 9 10
#  ..$ B: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
#  $ partialTransform: chr(0) 
#  - attr(*, "class")= chr [1:2] "multipleComparison" "comparison"

该包还包括其他几个函数,以及许多可以限制或扩展比较前允许的转换类型的参数。

于 2012-10-15T08:31:38.127 回答
1

您可以使用创建具有逻辑值的对象

a == b

这将具有FALSE两个对象具有不同值的值。

您还可以使用:

a[a != b]

或者

b[a != b]

看看差异在哪里。

于 2012-10-15T07:36:25.023 回答
0

我有机会确定两个数据帧 c1 和 c2 的不同之处,并创建了像这样的快速破解。如果对您有帮助,请继续调整。

for (i in 1:nrow(c1)) {
  if (!identical(c1[i,], c2[i,])) {
    print(paste("Differs in row", i))
    stop()
  }
}
于 2015-10-14T19:41:09.290 回答