Подходы к передаче нескольких таблиц данных в функцию с использованием lapply в R - PullRequest
1 голос
/ 26 мая 2020

В общем, мне часто требуется передать несколько таблиц данных по очереди функции, которая выполняет некоторые изменения в таблице данных, а затем вернуть эту измененную таблицу в глобальную среду. В качестве основного примера c объединение таймсерий широкого формата, а также переименование одной из переменных:

DT1 <- data.table("Country"=c("UK","France"),
                  "22.1.20"=c(30,32), "23.1.20"=c(32,34), "24.1.20"=c(42,44))

DT2  <- data.table("Country"=c("UK","France"),
                "22.1.20"=c(10,20), "23.1.20"=c(12,22), "24.1.20"=c(14,24))

DTList <- list(DT1, DT2) #list of wide format timeseries data tables with Country column and case counts 
                         #by country in numerous date columns

meltAndNameDT <- function(DT) {

  DT <- melt(DT, variable.name="Date", value.name="Count")  #reshape dataset
  setnames(DT,  old="Date", new="observationDate")          #rename variable
  return(DT)

}

Достаточно просто написать функции и вручную вызывать их с каждым набором данных, передаваемым явно, но это многословно и негибко, поэтому я хотел бы иметь возможность делать это в lapply, используя список таблиц данных, которые я sh изменяю.

Использование lapply, как в lapply(DTList, meltAndNameDT), возвращает список измененных таблиц данных, но, очевидно, не присваивает им их исходные имена. Для этого нужно (я думаю) немного повозиться, чтобы последовательно переназначить их объектам в DTList, что усложняется, поскольку эти объекты не имеют имен. Мне также интересно, будет ли это эффективным с точки зрения использования памяти и обработки времени.

Кажется, что простейшая альтернатива - передать вектор имен таблиц данных, хранящихся в виде строк, и заставить функцию изменять таблицы данных в глобальной среде, например:

DTList <- c("DT1", "DT2")

meltAndNameDT <- function(DT) {

  assign(DT, melt(get(DT), variable.name="Date", value.name="Count"),envir=globalenv())  #reshape dataset
  setnames(get(DT), old="Date", new="observationDate")                                   #rename variable

}

lapply(DTList, meltAndNameDT)

Это работает, но использование функции присваивания и изменение переменных в глобальной среде обычно считается плохой практикой.

У меня двоякий вопрос: во-первых, существует ли простой способ присвоить список возвращаемых объектов соответствующим объектам списка ввода, и будет ли это эффективно с точки зрения памяти? А во-вторых, есть ли лучший или более правильный способ сделать это, чем второй?

Заранее благодарю за ваши мысли, я новичок в R и изо всех сил пытаюсь понять это.

...