【发布时间】:2013-08-21 21:16:31
【问题描述】:
假设我有一个包含这些列的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 做的大多数事情一样,可能有更好的方法。更好是指内存效率更高、速度更快和/或使用更少的代码行。有没有人有更好的方法来实现这一点?
【问题讨论】:
标签: r data.table reshape