我想比较两个数据帧并检查它们是否具有相同的列集,是否有任何内置函数或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[...]. "
现在它们显示为不相同的数据帧。
我想比较并检查第二种情况,其中值不同但列名称及其类型相同。基本上如果两者都有相同的架构。
答案 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)
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)
允许进行更详细的比较,以查看哪些列匹配或不匹配。
完全公开:由于您询问是否存在一个包含此功能的库,因此我一直维护此软件包并提供此答案。