Я хотел бы создать функцию, в которой аргументом ( input ) будет неизвестное количество кадров данных (может варьироваться), а выводом будет кадр данных с типом данных для каждого столбца кадров данных из ввода.
Пример: у меня есть 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
, который возвращает только первый:
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"
Комментариев нет:
Отправить комментарий