Отменить преобразование в исходный формат 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

Однако порядок столбцов изменяется... есть идеи, как сохранить его в первоначальном порядке?

Другие вопросы по тегам