Как создать именованный список всех фреймов данных/таблиц в глобальной среде в R? Есть ли способ сделать это без ручного жесткого кодирования всех фреймов данных/таблиц?
Т.е. если глобальная среда содержит кадры данных/таблицы df_1, my_data_1, science_1, all_data, как создать вывод, который выглядит так:
files_list <- list(
df_1 = df_1,
my_data_1 = my_data_1,
science_1 = science_1,
all_data = all_data
)
Мы можем Filter элементы, которые являются data.frame или tibble в среде, над которой мы работаем, например. в глобальной среде это может быть
Filter(length, eapply(.GlobalEnv,
function(x) if (is.data.frame(x)||is_tibble(x)) x))
Здесь нужно is_tibble? is.data.frame(tibble(iris)) все равно возвращает TRUE
@GuedesBF Не совсем, это просто для того, чтобы сделать это явным. Если бы я только что использовал is.data.frame (который был бы базовым классом), то были бы комментарии о том, что непонятно, как он включает регистр символов.
Мы можем сначала get все объекты, затем keep только data.frames
library(purrr)
mget(ls()) %>% keep(is.data.frame)
Пожалуйста, попробуйте приведенный ниже код, который сгенерирует df
naml <- list()
for (i in seq_along(ls(envir =.GlobalEnv))) {
j <- ls(envir =.GlobalEnv)[i]
if (any(class(get(j))=='data.frame')) name <- {j} else name <- NA
if (any(class(get(j))=='data.frame')) class <- class(get(j))[3] else class <- NA
if (!is.na(name) & !is.na(class)) {
df <- data.frame(namex=name,classx=class)
naml[[j]] <- df
}
}
df2 <- do.call(rbind, naml) %>% rownames_to_column('name') %>%
pivot_wider(names_from = name, values_from = namex)
Базовым способом объединения методов @GuedesBF и @akrun может быть использование ls, mget и Filter.
Filter(is.data.frame, mget(ls()))
#Filter(is.data.frame, mget(ls(.GlobalEnv))) #More explicit using globEnv