如何比较两个数据框是否具有相同的列名和类?

时间:2018-03-24 17:14:32

标签: r dataframe

我想比较两个数据帧并检查它们是否具有相同的列集,是否有任何内置函数或R中的任何库?这些数据框的值可能不同,但两个数据框都具有相同的类型和命名列。

我尝试在mtcars和副本数据框上运行identicalall_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[...]. "

现在它们显示为不相同的数据帧。

我想比较并检查第二种情况,其中值不同但列名称及其类型相同。基本上如果两者都有相同的架构。

2 个答案:

答案 0 :(得分:4)

我认为这个问题的答案是:是否存在R&#34;同一架构&#34;数据帧的功能是&#34;可能不是&#34;。 R数据帧实际上没有数据库结构。如果你想测试名称和类的相等性,@ karun给你一个由两部分组成的解决方案。这将是另一种基本上清空数据帧的方法,但保留了它们的列名和类:

identical(duplicate[NA,][1,], mtcars[NA,][1,])
[1] TRUE

这不仅会检查名称,还会检查整个对象的类和基础列的类,可以通过以下方式进行测试:

 my.schema <-  mtcars[NA,][1,] 
 my_schema[['mpg']] <- NA_integer_

identical(duplicate[NA,][1,], my.schema)
[1] FALSE

仅将类从double更改为整数会导致identical报告非身份。 identity功能可能相当挑剔,人们已经询问了很多关于为何报告FALSE的SO问题。即使存在属性差异(通常不是&#34;可见&#34;在对象的打印输出中)也会被报告为&#34;不同&#34;。

创建&#34;架构&#34;的另一种方式(可能更优雅和直观)对于数据框,将使用0:

索引行
mtcars[0,]

sapply( mtcars[0,] , class)
      mpg       cyl      disp        hp      drat        wt      qsec        vs 
"numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" 
       am      gear      carb 
"numeric" "numeric" "numeric" 

答案 1 :(得分:0)

janitor 包中的

compare_df_cols_same()会检查data.frame是否具有相同的列名以及这些列的类是否匹配:

library(janitor)
duplicate <- mtcars
duplicate$mpg <- as.numeric(scale(duplicate$mpg))
compare_df_cols_same(mtcars, duplicate)
#> [1] TRUE

相关的compare_df_cols(mtcars, duplicate)允许进行更详细的比较,以查看哪些列匹配或不匹配。

完全公开:由于您询问是否存在一个包含此功能的库,因此我一直维护此软件包并提供此答案。