Допустим, у меня есть data.table
с этими столбцамиR data.table перекроить куски колонн сразу
nodeID
hour1aaa
hour1bbb
hour1ccc
hour2aaa
hour2bbb
hour2ccc
...
hour24aaa
hour24bbb
hour24ccc
в общей сложности 72 колонн. Давайте назовем это rawtable
Я хочу, чтобы изменить его так, у меня есть
nodeID
hour
aaa
bbb
ccc
в общей сложности только эти 5 столбцов где час колонка будет содержать какой бы час от первоначального 72, что должно быть. Давайте назовем это newshape
Как я это делаю сейчас, чтобы использовать rbindlist
с 24 элементов, где каждый элемент является подмножеством большей data.table. Как это (за исключением я уезжаю из большинства часов в моем примере)
newshape<-rbindlist(list(
rawtable[,list(nodeID, Hour=1, aaa=hour1aaa, bbb=hour1bbb, ccc=hour1ccc)],
rawtable[,list(nodeID, Hour=2, aaa=hour2aaa, bbb=hour2bbb, ccc=hour2ccc)],
rawtable[,list(nodeID, Hour=24, aaa=hour24aaa, bbb=hour24bbb, ccc=hour24ccc)]))
Вот некоторые выборочные данные, чтобы играть с
rawtable<-data.table(nodeID=c(1,2),hour1aaa=c(12.4,32),hour1bbb=c(61.1,65.33),hour1ccc=c(-4.2,54),hour2aaa=c(12.2,1.2),hour2bbb=c(12.2,5.7),hour2ccc=c(5.6,101.9),hour24aaa=c(45.2,8.5),hour24bbb=c(23,7.9),hour24ccc=c(98,32.3))
Используя мой rbindlist
подход дает желаемый результат, но, как с большинством вещей, которые я делаю с R, возможно, лучший способ. К лучшему я имею в виду более эффективную память, быстрее и/или использует меньше строк кода. У кого-то есть лучший способ добиться этого?
+1 Я не думаю, что возникла проблема с базой R reshape. Мне всегда кажется, что 'reshape' не беспокоится о том, чтобы выяснить часть' variableing = list (...) ', особенно когда вам нужно указывать' v.names' в этих случаях. – A5C1D2H2I1M1N2O1R2T1
@ АнандаМахто - небольшая цена для оплаты, я полагаю. Вы всегда можете использовать 'keynames <- c (" aaa "," bbb "," ccc ")' и использовать 'lapply (keynames, grep, names (rawtable))' в 'изменяющихся' и' keynames' в ' часть v.names'. Однако это немного неудобно. – thelatemail
Я определил для своих целей векторы «grep» для таких целей: 'vGrep <- Vectorize (grep,« pattern », SIMPLIFY = FALSE)'. – A5C1D2H2I1M1N2O1R2T1