2013-12-20 51 views
3

我有兩個數據幀是在兩個不同的場合生成的,但我懷疑它們是相等的。兩者都有相同數量的行和列,在視覺上它們似乎是相同的,除了行的排列方式。檢查一個數據幀是否是另一個數據幀的重新排序

我也沒有可以重新排序的ID列,我可以做的最好的是重新排列一個process_number變量,這是最接近我可以得到一個獨特的列。然而,即使之後重新排序identical產生FALSEall.equal給我這個(總結):

[1] "Component 2: 32 string mismatches" 
[16] "Component 18: 'is.NA' value mismatch: 183357 in current 183357 in target" 
[23] "Component 27: Mean relative difference: 0.4688722" 
[24] "Component 28: Mean relative difference: 0.0004968944" 
[26] "Component 30: Attributes: < Component 2: 365 string mismatches >" 
[28] "Component 31: 'current' is not a factor" 

回答

3

我發現這些情況下,最好的選擇是使用「比較」包:

library(compare) 
compare(df1, df2, allowAll = TRUE) 

allowAll參數嘗試不同的轉換(例如,重新排序行,重新排序列,更改列類型字符因素等),然後給出了不同轉換之後,兩個輸入是否相同的總結。如果在應用轉換後它們相同,它會告訴您需要進行哪些轉換才能使它們相同。

+0

我認爲'比較'會花費幾個小時來檢查我的30萬數據幀,但它在幾分鐘內產生了一個有趣的輸出。當然,我使用'ignoreOrder'而不是'allowAll',但無論如何,這幫助我進一步調查問題。謝謝! –

1

你的方法是正確的。

all.equal告訴你,你的數據幀不是彼此重新排序。

有關詳細信息,請檢查

mismatch_in_col_2 <- data1[, 2] != data2[, 2] 
cbind(data1[mismatch_in_col_2, 2], data2[mismatch_in_col_2, 2]) 

(重複與差異等欄目。)


你提到process_number「是最接近我能得到一個唯一的列」 。也許一些區別涉及到以不同方式排序的關係。是否有第二列可以排序?

0

解決方法 - 如果它們相同,那麼merge(df1,df2,by=colnames(df), all = TRUE)應返回與df1df2完全相同的行?