Povedzme, že mám veľké súbory údajov v R a chcem lenvedieť, či sú dvaja rovnaké. Toto často používam, keď experimentujem s rôznymi algoritmami, aby som dosiahol rovnaký výsledok. Napríklad povedzme, že máme nasledujúce súbory údajov:
df1 <- data.frame(num = 1:5, let = letters[1:5])
df2 <- df1
df3 <- data.frame(num = c(1:5, NA), let = letters[1:6])
df4 <- df3
Takto ich porovnávam:
table(x == y, useNA = "ifany")
Čo funguje skvele, keď súbory údajov neobsahujú NA:
> table(df1 == df2, useNA = "ifany")
TRUE
10
Ale nie toľko, keď majú NA:
> table(df3 == df4, useNA = "ifany")
TRUE <NA>
11 1
V príklade je ľahké prepustiť NA
ako problém, pretože vieme, že obidva dátové rámce sú rovnať. Problém je v tom NA == <anything>
výťažky NA
, takže vždy, keď má jeden zo súborov údajov NA
, nezáleží na tom, čo má ten druhý na tej istej pozícii, výsledok bude vždy NA
.
Takže pomocou table()
na porovnanie údajov sa mi nezdá ideálny. Ako môžem lepšie skontrolovať, či sú dva dátové rámce rovnaké?
Poznámka: Toto nie je duplikát R - porovnanie viacerých súborov údajov, Porovnávam 2 súbory údajov v R alebo Porovnať súbory údajov v R
odpovede:
40 pre odpoveď č. 1Vyhľadajte všetko. Má niekoľko jazdcov, ale môže to fungovať pre vás.
all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE
14 pre odpoveď č. 2
ako metriky zdôraznil, jeden by mohol tiež použiť identical()
na porovnanie množín údajov. Rozdiel medzi týmto prístupom a prístupom Codoremifa je to tak identical()
len prinesie TRUE
z FALSE
, v závislosti od toho, či porovnávané objekty sú rovnaké alebo nie, zatiaľ čo all.equal()
buď sa vráti TRUE
alebo rady o rozdieloch medzi objektmi. Zvážte napríklad toto:
> identical(df1, df3)
[1] FALSE
> all.equal(df1, df3)
[1] "Attributes: < Component 2: Numeric: lengths (5, 6) differ >"
[2] "Component 1: Numeric: lengths (5, 6) differ"
[3] "Component 2: Lengths: 5, 6"
[4] "Component 2: Attributes: < Component 2: Lengths (5, 6) differ (string compare on first 5) >"
[5] "Component 2: Lengths (5, 6) differ (string compare on first 5)"
Navyše, z toho, čo som testoval identical()
Zdá sa, že beží oveľa rýchlejšie ako all.equal()
.