比较2个数据框以确保R

时间:2019-06-12 19:17:10

标签: r dataframe compare equality

我有2个具有2个相同列的数据框。我想检查数据集是否相同。原始数据集大约有70万条记录,但我正在尝试找出一种使用虚拟数据集的方法

我尝试使用compare,same,all,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(无序)

4 个答案:

答案 0 :(得分:4)

我建议

dplyr的{​​{1}}用于数据帧

setdiff

请注意,这将不考虑重复行数。 (即,如果library(dplyr) nrow(setdiff(a, c)) == 0 & nrow(setdiff(c, a)) == 0 # [1] TRUE 具有一行的多个副本,而a仅具有该行的一个副本,它将仍然返回c)。不确定如何处理重复的行...

如果您确实关心重复数是否相同,那么我建议两种可能性:(a)添加一个ID列以区分重复项并使用上述方法,或者(b)排序,重置行名(烦人),并使用TRUE

(a)添加ID列

identical

(b)排序

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

答案 1 :(得分:1)

也许您需要一个在比较之前对列进行排序的函数。但是在大型数据帧上会很慢。

unordered_equal <- function(X, Y, exact = FALSE){
  X[] <- lapply(X, sort)
  Y[] <- lapply(Y, sort)
  if(exact) identical(X, Y) else all.equal(X, Y)
}

unordered_equal(a, c)
#[1] TRUE
unordered_equal(a, c, TRUE)
#[1] TRUE

a$x <- a$x + .Machine$double.eps
unordered_equal(a, c)
#[1] TRUE
unordered_equal(a, c, TRUE)
#[1] FALSE

答案 2 :(得分:0)

基本上,您想要的是比较有序的基础矩阵。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class WordsOfFiles {

    public static void main(String[] args) throws IOException {
        List<String> words = Files.lines(new File("X.txt").toPath()).flatMap(line -> Stream.of(line.split("\\s+"))).collect(Collectors.toList());
        words.forEach(System.out::println);

    }
}

为方便起见,可以将其包装到函数中

all.equal(matrix(unlist(a[order(a[1]), ]), dim(a)),
          matrix(unlist(c[order(c[1]), ]), dim(c)))
# [1] TRUE
identical(matrix(unlist(a[order(a[1]), ]), dim(a)),
          matrix(unlist(c[order(c[1]), ]), dim(c)))
# [1] TRUE

答案 3 :(得分:0)

您可以使用名为 waldo 的新包

library(waldo)
a <- data.frame(x = 1:10, b = 20:11)
c <- data.frame(x = 10:1, b = 11:20)

compare(a,c)

你会得到:

`old$x`: 1 2 3 4 5 6 7 8 9 10 and 9 more...
`new$x`:                   10           ...

`old$b`: 20 19 18 17 16 15 14 13 12 11 and 9 more...
`new$b`: