我想比较两个数据框并检查它们是否具有相同的列集,R 中是否有任何内置函数或任何库?这些数据框的值可能不同,但两个数据框的类型和命名列都相同。
我试过运行 identical
和 all_equal
在 mtcars 和副本数据帧上:
duplicate <- mtcars
identical(mtcars, duplicate)
[1] TRUE
all_equal(mtcars, duplicate)
[1] TRUE
然后我更新了
mpg
data.frame 重复的列具有与 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[...]. "
现在它们显示为不相同的数据帧。
我想在第二种情况下进行比较和检查,其中值不同但列名及其类型相同。基本上,如果两者都具有相同的架构。
最佳答案
我认为这个问题的答案是:数据帧是否有 R 的“相同模式”函数“可能没有”。 R 数据框并没有真正的数据库结构。如果您想测试名称和类的相等性,@akrun 为您提供了一个由两部分组成的解决方案。这将是另一种基本上清空数据框的方法,但保留它们的列名和类:
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 的问题。即使存在属性差异(通常在对象的打印输出中“不可见”)也会被报告为“不同”。为数据框创建“模式”的另一种方法(可能更优雅和直观)是用 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"
关于r - 如何比较两个数据框是否具有相同的列名和类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49467549/