Как прокомментировано и часто обсуждается в тэге R SO, просто используйте список, чтобы поддерживать все ваши отдельные, аналогично структурированные фреймы данных. Это дает вам следующие преимущества:
Простое последовательное выполнение операций для всех элементов с использованием петель или применение семейных вызовов без отдельных назначений имен.
Организует вашу среду и рабочее пространство с поддержкой одного объекта с легкой ссылкой по номеру или имени вместо 31 объекта, заполняющего вашу глобальную среду.
Облегчает миграцию и обработку фрейма данных с помощью rbind
, cbind
, split
, by
или других операций.
Чтобы создать список всех текущих фреймов данных в глобальной среде, используйте фильтрацию eapply
или mget
для объектов фрейма данных. Каждый возвращает именованный список фреймов данных.
teachers_df_list <- Filter(is.data.frame, eapply(.GlobalEnv, identity))
teachers_df_list <- Filter(is.data.frame, mget(x=ls()))
В качестве альтернативы, используйте исходные фреймы данных из файловых источников, используя объекты списка, такие как list.files
:
teachers_df_list <- lapply(list.files(...), function(f) read.csv(f, ...))
Вы не теряете функциональность фрейма данных, если хранитесь внутри списка.
head(teachers_df_list$alexandre)
tail(teachers_df_list$adrian)
summary(teachers_df_list$akemi)
...
Затем выполните необходимые операции с помощью lapply
, например, переименование столбцов с функцией правой стороны, setNames
. Запустите другие необходимые операции: aggregate
или lm
.
new_teachers_df_list <- lapply(teachers_df_list,
function(df) setNames(df, paste0("col_", c(1:18)))
new_teachers_agg_list <- lapply(teachers_df_list,
function(df) aggregate(col1 ~ col2, df, sum))
new_teachers_model_list <- lapply(teachers_df_list,
function(df) summary(lm(col1 ~ col2, df)))
Даже скомпилируйте все кадры данных в одну основную версию, используя do.call
+ rbind
:
# ADD A TEACHER INDICATOR COLUMN
new_teachers_df_list <- Map(function(df, n) transform(df, teacher=n),
new_teachers_df_list, names(new_teachers_df_list))
# BUILD SINGLE DF
teachers_df <- do.call(rbind, new_teachers_df_list)
Даже split
основная версия возвращается в отдельные группы, если потребуется позже:
# SPLIT BACK TO LIST OF DFs
teachers_df_list <- split(teachers_df, teachers_df$teacher)