r - 在 R 中比较 2 个数据帧是否相等
问题描述
我有 2 个具有 2 个相同列的数据框。我想检查数据集是否相同。原始数据集有大约 70 万条记录,但我正在尝试找出一种使用虚拟数据集的方法
我尝试使用比较、相同、全部、all_equal 等。它们都没有返回 True。
虚拟数据集是 -
a <- data.frame(x = 1:10, b = 20:11)
c <- data.frame(x = 10:1, b = 11:20)
all(a==c)
[1] FALSE
compare(a,c)
FALSE [FALSE, FALSE]
identical(a,c)
[1] FALSE
all.equal(a,c)
[1] "Component “x”: Mean relative difference: 0.9090909" "Component “b”: Mean relative difference: 0.3225806"
数据集完全相同,除了记录的顺序。如果这些功能仅在数据集彼此镜像时才有效,那么我必须尝试其他方法。如果是这种情况,有人可以帮助我如何为这两个数据集(无序)获得 True
解决方案
dplyr
的setdiff
作品在数据框架上,我会建议
library(dplyr)
nrow(setdiff(a, c)) == 0 & nrow(setdiff(c, a)) == 0
# [1] TRUE
请注意,这不会考虑重复行的数量。(即,如果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
(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
推荐阅读
- parallel-processing - CUDA 拥有并行内核意味着什么?
- python - 查找具有匹配值的所有行,将所有匹配值输出到同一行
- sql-server - 基于依赖项对发布管道进行排序
- kubernetes - 带有 2 个容器和仪表板的 Pod
- r - How do I find more than one value close to another value?
- php - 如何在php中按周显示网格中的天数?
- r - 如果 which(x) 的长度为 0,为什么 y[-which(x)] 返回一个长度为 0 的向量?
- c# - 如何在字段级别运行自定义操作方法
- c# - 如何确定哪个控制边缘用户正在离开 UWP
- mysql - MySQL让它在case语句中识别0小于A