#r #data.table
#r #data.table
Вопрос:
В своих проектах я обычно готовлю данные с помощью нескольких функций, поэтому мой код обычно выглядит так:
readAndClean("directory") %>%
processing() %>%
readyForModelling()
Где я передаю объект data.table из одной функции в другую.
У меня появилась привычка всегда запускать эти функции с:
processing <- function(data_init){
data <- copy(data_init)
}
чтобы избежать внесения изменений в DT в глобальной среде, как показано в следующем примере,:
test <- data.table(cars[1:10,])
processing <- function(data_init){
data_init[, id := 1:.N]
return("done")
}
test
# speed dist
# 1: 4 2
# 2: 4 10
# 3: 7 4
# 4: 7 22
# 5: 8 16
# 6: 9 10
# 7: 10 18
# 8: 10 26
# 9: 10 34
# 10: 11 17
processing(test)
# [1] "done"
test
# speed dist id
# 1: 4 2 1
# 2: 4 10 2
# 3: 7 4 3
# 4: 7 22 4
# 5: 8 16 5
# 6: 9 10 6
# 7: 10 18 7
# 8: 10 26 8
# 9: 10 34 9
# 10: 11 17 10
Но это всегда кажется мне немного уродливым.
Это правильный способ обработки data.tables внутри функций?
Комментарии:
1. Использование
copy
такого рода сводит на нет назначение data.table, потому что вы потеряете большую часть его эффективности.2. @Roland даже если это только один раз в начале кода? После этого я выполняю несколько агрегаций, объединений и создания переменных с скопированной таблицей.
3. Тогда у вас все еще может быть некоторая выгода, но глубокое копирование очень дорого с точки зрения производительности. Это не будет иметь большого значения, если ваши данные довольно малы, и вы используете data.table в первую очередь из-за его приятного синтаксиса. Чего я не понимаю, так это почему вы хотите избежать изменения исходного data.table в вашем конкретном случае. Я бы подумал, что изменение на месте было бы довольно удобно, если вы выполняете «подготовку данных».
4. Я думаю, если у вас есть несколько параллельных
processing()
шагов, работающих с одними и теми же необработанными данными, вы хотели бы оставить необработанные данные как есть, или если вы тестировали и хотели сравнить обработку до и после. Но если это большой набор данных, я бы постарался максимально использовать модификацию на месте и не создавать дубликаты моих данных. Концептуально все еще полезно упорядочивать вещи, как вы делаете.