我正在比较 R 中的多个数据框,每个数据框都有多个列,这些列应该具有相同的名称和相同的数据类型。我知道如何在检查匹配列名时简单地为 TRUE/FALSE 结果编码,并且我有一种检查匹配列数据类型的方法,但是数据类型方法需要比列名方法长得多的代码,我想要一个更简单的方法解决方案。
我可以验证列名是否与 (code_1) 匹配:
all(c(
all(colnames(df_1)==colnames(df_2)),
all(colnames(df_1)==colnames(df_3))
))
但是要验证数据类型是否匹配,这是我能想到的最好的(code_2):
all(c(
all(c(
class(df_1$column_1)==class(df_2$column_1),
class(df_1$column_2)==class(df_2$column_2)
)),
all(c(
class(df_1$column_1)==class(df_3$column_1),
class(df_1$column_2)==class(df_3$column_2)
))
))
理想情况下,我想要这样的东西可以做相当于 code_2 (code_3) 的事情:
all(c(
all(xyzfunction(df_1)==xyzfunction(df_2)),
all(xyzfunction(df_1)==xyzfunction(df_3))
))
我不知道这样的“xyzfunction”是否存在,但我的研究找不到这样的函数。当你有更多的数据帧和每个数据帧的列时,你们中有人知道这样的函数或更简单的方法来编写 code_2 吗?
你不能用
==
来比较class
的返回,因为它的返回长度是可变的:
class(1)
# [1] "numeric"
class(Sys.time())
# [1] "POSIXct" "POSIXt"
class(ggplot2::diamonds)
# [1] "tbl_df" "tbl" "data.frame"
使用它应该足够安全
identical
,不过。
xyzfunction <- function(x, y) {
if (!identical(sort(names(x)), sort(names(y)))) return(FALSE)
nms <- names(x)
return(identical(lapply(.subset(x, nms), class), lapply(.subset(y, nms), class)))
}
我使用
.subset
而不是x[nms]
,因为x[nms]
适用于data.frame
和tbl_df
但不适用于data.table
,并且subset
本身更多地用于交互式使用,而不是像这样的程序化无监督使用。