在 R 中比较 2 个数据帧是否相等

Kri*_*i07 1 compare equality r dataframe

我有 2 个数据框,其中有 2 个相同的列。我想检查数据集是否相同。原始数据集有大约 700K 记录,但我正在尝试找出一种使用虚拟数据集来做到这一点的方法

\n\n

我尝试使用比较、相同、全部、all_equal 等。它们都没有返回 True。

\n\n

虚拟数据集是 -

\n\n
a <- data.frame(x = 1:10, b = 20:11)\nc <- data.frame(x = 10:1, b = 11:20)\n\nall(a==c)\n[1] FALSE\n\ncompare(a,c)\nFALSE [FALSE, FALSE]\n\nidentical(a,c)\n[1] FALSE\n\n all.equal(a,c)\n[1] "Component \xe2\x80\x9cx\xe2\x80\x9d: Mean relative difference: 0.9090909" "Component \xe2\x80\x9cb\xe2\x80\x9d: Mean relative difference: 0.3225806"\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

除了记录的顺序之外,数据集完全相同。如果这些函数仅在数据集互为镜像时才起作用,那么我必须尝试其他方法。如果是这种情况,有人可以帮助我如何为这两个数据集(无序)获得 True

\n

Gre*_*gor 5

dplyrsetdiff我建议在数据框架上工作

library(dplyr)
nrow(setdiff(a, c)) == 0 & nrow(setdiff(c, a)) == 0
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

请注意,这不会考虑重复行的数量。(即,如果a有一行的多个副本,并且c只有该行的一个副本,它仍然会返回TRUE)。不确定您希望如何处理重复行...

如果您确实关心具有相同数量的重复项,那么我建议两种可能性:(a)添加 ID 列来区分重复项并使用上面的方法,或(b)排序,重置行名称(令人烦恼),并使用identical.

(a)添加ID列

library(dplyr)
a_id = group_by_all(a) %>% mutate(id = row_number())
c_id = group_by_all(c) %>% mutate(id = row_number())
nrow(setdiff(a_id, c_id)) == 0 & nrow(setdiff(c_id, a_id)) == 0
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

(b)排序

a_sort = a[do.call(order, a), ]
row.names(a_sort) = NULL
c_sort = c[do.call(order, c), ]
row.names(c_sort) = NULL
identical(a_sort, c_sort)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)