Отменить преобразование в исходный формат data.table
Приведены следующие данные таблицы с описанием производственных затрат для производства автомобилей в странах AT и BE:
DT <- data.table( Abb=c("AT", "AT", "BE", "BE"),input=c("iron", "glass", "iron", "glass"),AT_Car=c(5,5,0,5),BE_Car=c(0,3,2,2))
> DT
Abb input AT_Car BE_Car
1: AT iron 5 0
2: AT glass 5 3
3: BE iron 0 2
4: BE glass 5 2
Я использовал функцию изменения формы для вычисления чего-либо:
DT2 <- reshape(DT,direction='wide',idvar='Abb', timevar='input')
> DT2
Abb AT_Car.iron BE_Car.iron AT_Car.glass BE_Car.glass
1: AT 5 0 5 3
2: BE 0 2 5 2
После изменения мне нужно конвертировать DT2 обратно в исходный формат DT. Как мне этого добиться?
Заранее спасибо.
2 ответа
Разрабатываемая версия data.table, v1.9.5
имеет новые функции для melt
а также dcast
методы data.table. Обратитесь к разделу Эффективное изменение формы с использованием data.tables для получения более подробной информации и Вики для начала работы для других виньеток.
Длинноширокий - dcast
принимает несколько столбцов:
require(data.table) # v1.9.5+
DT.c = dcast(DT, Abb ~ input, value.var = c('AT_Car', 'BE_Car'))
# Abb AT_Car_glass AT_Car_iron BE_Car_glass BE_Car_iron
# 1: AT 5 5 3 0
# 2: BE 5 0 2 2
Широкий к длинному - melt
также принимает список для measure.vars
:
DT.m = melt(DT.c, id = "Abb", measure.vars = patterns("^AT_Car", "^BE_Car"),
variable.name = "input", value.name = c("AT_Car", "BE_Car"))
setattr(DT.m$input, 'levels', c("glass", "iron"))
# Abb input AT_Car BE_Car
# 1: AT glass 5 3
# 2: BE glass 5 2
# 3: AT iron 5 0
# 4: BE iron 0 2
Судя по всему, использование одной и той же функции изменения формы от ширины к длине похоже работает:
DT3 <- reshape(DT2,direction='long',idvar='Abb', timevar='input')
> DT3
Abb input AT_Car.iron BE_Car.iron
1: AT iron 5 0
2: BE iron 0 2
3: AT glass 5 3
4: BE glass 5 2
Однако порядок столбцов изменяется... есть идеи, как сохранить его в первоначальном порядке?