使用R时,我通常会使用identical(a,b)
来检查对象a
和b
是否相同。如果这返回FALSE
我希望能够看到这些差异在哪里......是否有一个函数可以告诉我这个?
答案 0 :(得分: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"
答案 1 :(得分:5)
这并不完全回答您的问题,但您可能也对"compare" package感兴趣。
特别是,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)])
现在,使用compare来查看它是否能够使数据相同。对于“b”,“d”和“e”,它能够应用某些变换使它们与“a”相同,但是在比较“f”和“a”时它无法这样做。 / p>
(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"
该软件包还包括其他几个函数,以及许多可以限制或扩展比较前允许的转换类型的参数。
答案 2 :(得分:1)
您可以使用
创建具有逻辑值的对象a == b
将具有FALSE
值,其中两个对象具有不同的值。
您也可以使用:
a[a != b]
或
b[a != b]
看看差异在哪里。
答案 3 :(得分:0)
我有机会确定两个数据帧c1和c2的不同之处,并创建了像这样的快速黑客。如果对您有帮助,请继续调整。
for (i in 1:nrow(c1)) {
if (!identical(c1[i,], c2[i,])) {
print(paste("Differs in row", i))
stop()
}
}