R 中的函数/代码是 colnames() 的 class() 变体

问题描述 投票:0回答:1

我正在比较 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 吗?

r function class analytics information-retrieval
1个回答
1
投票

你不能用

==
来比较
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
本身更多地用于交互式使用,而不是像这样的程序化无监督使用。

© www.soinside.com 2019 - 2024. All rights reserved.