В общем, мне часто требуется передать несколько таблиц данных по очереди функции, которая выполняет некоторые изменения в таблице данных, а затем вернуть эту измененную таблицу в глобальную среду. В качестве основного примера 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 и изо всех сил пытаюсь понять это.