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

标签 r dataframe

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

我试过运行 identicalall_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/

相关文章:

r - 评估 .SDcols 上的函数并返回 data.table 中的所有列

R ggplot : Change spacing between two different legends

python & pandas - 如何计算 DataFrame 中列条件下的频率?

r - dplyr "data_frame"函数无法进行回收并且 data.frame 有限制?

python - Pandas 中位数的奇怪行为

python - 如何合并 Series 和 DataFrame

R如何在nlslist中使用边界和 "port"算法?

r - 在 ggplot2 中绘制带空格的分箱离散数据

r - 使用 R 中的 Statnet 进行加权网络中的中心性测量

python - 如何在引用前一行的同时迭代 pandas 数据框?