【发布时间】:2018-09-03 04:28:28
【问题描述】:
我想比较两个数据框并检查它们是否具有相同的列集,R 中是否有任何内置函数或任何库?这些数据框的值可能不同,但两个数据框将具有相同的类型和命名列。
我尝试在 mtcars 和副本数据帧上运行 identical 和 all_equal:
duplicate <- mtcars
identical(mtcars, duplicate)
[1] TRUE
all_equal(mtcars, duplicate)
[1] TRUE
然后我更新了 data.frame 副本的 mpg 列,使其具有与 mtcars 不同的值:
duplicate$mpg <- as.numeric(scale(duplicate$mpg))
再次运行相同的命令:
identical(mtcars, duplicate)
[1] FALSE
all_equal(mtcars, duplicate)
[1] "Rows in x but not y: 23, 1, 6, 14, 10, 12, 13, 17, 28, 32, 7[...]. Rows in y but not x: 12, 25, 1, 20, 30, 5, 14, 7, 11, 29, 21[...]. "
现在它们显示为不相同的数据框。
我想在第二种情况下比较和检查值不同但列名及其类型相同的情况。基本上,如果两者具有相同的架构。
【问题讨论】:
-
您可以通过
identical(names(dat1), names(dat2))和identical(sapply(dat1, class), sapply(dat2, class))查看 -
根据您的数据,结合这两个逻辑条件应该可以
identical(names(mtcars), names(duplicate)) & identical(sapply(mtcars, class), sapply(duplicate, class))# [1] TRUE。您也可以查看library(diffObj);diffObj(mtcars, duplicate) -
all.equal(mtcars, duplicate, tolerance = Inf) -
@rawr:我对这个问题的理解(很可能不正确)是内部值和行数都不是问题。无论如何,提问者现在有几个选择来满足他的目的。