2012-10-15 66 views
3

之間的差異當使用R,我通常使用identical(a,b),以檢查對象ab是相同的。如果這返回FALSE我希望能夠看到這些差異在哪裏......是否有一個函數可以告訴我這個?函數來顯示的兩個或更多個對象

回答

1

可以使用

a == b 

這將有FALSE值,其中兩個對象有不同的價值觀創建邏輯值的對象。

您還可以使用:

a[a != b] 

b[a != b] 

,看看那裏的差異。

+0

這將如何顯示我的差異在哪裏? –

+0

您可以編寫一個函數來顯示這些差異,其中所述值爲'FALSE'。 –

+0

@ h.l.m我在我的答案中添加了一些信息。希望這會對你有所幫助。 –

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" 
4

這並不完全回答你的問題,但你也可能有興趣在"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)]) 

現在,使用比較看看它是否能夠使數據相同。對於「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" 

該軟件包還包含其他幾個函數,以及許多可以限制或擴展比較前允許的轉換類型的參數。

0

我曾經有機會確定兩個數據框c1和c2的不同之處,並創建了像這樣的快速入侵。繼續調整,如果對你有幫助。

for (i in 1:nrow(c1)) { 
    if (!identical(c1[i,], c2[i,])) { 
    print(paste("Differs in row", i)) 
    stop() 
    } 
} 
相關問題