用于检查多个数据帧 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
的选项,另外还使用 janitor
和 data.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
我想创建一个函数,其中参数 (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
的选项,另外还使用 janitor
和 data.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