用于检查多个数据帧 R 的数据类型的功能

Function for checking data type for several data frames R

我想创建一个函数,其中参数 (input) 是未知数量的数据帧(可能会有所不同)和 output 是输入数据框的每一列数据类型的数据框。

示例:我下面有 2 个数据帧(数据帧的数量可能会有所不同,所以我不确定如何将其作为函数参数传递)。


# Dataframe 1
kpi_id <- c("SL",  "OOS")
kpi_val <- c (1,2)

df1 <-  data.frame(kpi_id,   kpi_val)

> sapply(df1, class)

   kpi_id     kpi_val 
"character"   "numeric"

# Dataframe 2
kpi_id <- c("SL",  "OOS")
kpi_val <- c ("3", "4")

df2 <-  data.frame(kpi_id,   kpi_val)

> sapply(df2, class)
  kpi_id     kpi_val 
"character" "character"

我可以通过如下简单的方式得到结果:

df_types1 <- as.data.frame(sapply(df1, class)) 
colnames(df_types)[1] <- deparse(substitute(df1))


df_types2 <- as.data.frame(sapply(df2, class)) 
colnames(df_types)[1] <- deparse(substitute(df2))


df_types3 <- bind_cols(df_types1, df_types2)

> df_types3
              df1       df2
kpi_id  character   character
kpi_val   numeric   character

如何创建初始数据帧数量未知的函数以获得相同的输出?

使用 rapply.

rapply(list(df1=df1, df2=df2), class, how='l') |>
  do.call(what='cbind')
#                 df1         df2        
# kpi_id  "character" "character"
# kpi_val "numeric"   "character"

如果由于多个 类、

而得到奇怪的输出
df1$date <- df2$date <- as.POSIXct(Sys.Date())

rapply(list(df1=df1, df2=df2), class, how='l') |>
  do.call(what='cbind')
#                df1         df2        
# kpi_id  "character" "character"
# kpi_val "numeric"   "character"
# date    character,2 character,2

您可以使用 data.class 其中 returns 只是第一个:

rapply(list(df1=df1, df2=df2), data.class, how='l') |>
  do.call(what='cbind')
#                df1         df2        
# kpi_id  "character" "character"
# kpi_val "numeric"   "character"
# date    "POSIXct"   "POSIXct"

这是您可以使用的功能;传递数据框列表,无论该列表是命名的还是未命名的:

df_types <- function(dfs) {
  do.call(
    rbind, 
    lapply(seq_along(dfs), function(d) {
        data.frame(
          df = ifelse(is.null(names(dfs)), rep(d,ncol(dfs[[d]])), names(dfs)[d]),
          col = names(dfs[[d]]),
          type=sapply(dfs[[d]],typeof),row.names = NULL)
      })
  )
}

用法

df_types(list("a" = df1,"b" = df2))

输出:

  df     col      type
1  a  kpi_id character
2  a kpi_val    double
3  b  kpi_id character
4  b kpi_val character

这是另一个使用 tidyverse 的选项,另外还使用 janitordata.table 将其转换为所需的格式:

library(tidyverse)

lst(df1, df2) %>%
  map_dfr(., ~ map_df(.x, class), .id = "var") %>%
  data.table::transpose(keep.names = "var") %>%
  janitor::row_to_names(1) %>%
  as_tibble() %>%
  column_to_rownames("var")

输出

              df1       df2
kpi_id  character character
kpi_val   numeric character
library(janitor)
compare_df_cols(df1, df2)
  column_name       df1       df2
1      kpi_id character character
2     kpi_val   numeric character