[英]R data.table reshape chunks of columns at once
可以說我有一個包含這些列的data.table
nodeID
hour1aaa
hour1bbb
hour1ccc
hour2aaa
hour2bbb
hour2ccc
...
hour24aaa
hour24bbb
hour24ccc
共72列。 我們稱它為rawtable
我想重塑它,所以我有
nodeID
hour
aaa
bbb
ccc
總共只有這5列,其中hour列將包含原始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所做的大多數事情一樣,可能還有更好的方法。 更好的意思是更高的內存效率,更快的速度和/或使用更少的代碼行。 有誰有更好的方法來實現這一目標?
如果按照您期望的標准約定來命名,這是一個經典的reshape
問題,盡管我不確定這是否真正利用了data.table
結構的效率:
reshape(
setNames(rawtable, gsub("(\\D+)(\\d+)(\\D+)", "\\3.\\2", names(rawtable))),
idvar="nodeID", direction="long", varying=-1
)
結果:
nodeID hour aaa bbb ccc
1: 1 1 12.4 61.10 -4.2
2: 2 1 32.0 65.33 54.0
3: 1 2 12.2 12.20 5.6
4: 2 2 1.2 5.70 101.9
5: 1 24 45.2 23.00 98.0
6: 2 24 8.5 7.90 32.3
@Arun
在這里的答案: https : @Arun
如果可以使其適應當前數據,也可能會很有用。
一種選擇是使用merged.stack
從我的包“splitstackshape”。 此函數stack
s組列,然后將輸出合並在一起。 由於函數是如何創建“ time”變量的,因此您可以指定要從列名中刪除的任何內容。 在這種情況下,我們要去除“ hour”,“ aaa”,“ bbb”和“ ccc”,只剩下剩余的數字。
library(splitstackshape)
## Make sure you're using at least 1.2.0
packageVersion("splitstackshape")
# [1] ‘1.2.0’
merged.stack(rawtable, id.vars="nodeID",
var.stubs=c("aaa", "bbb", "ccc"),
sep="hour|aaa|bbb|ccc")
# nodeID .time_1 aaa bbb ccc
# 1: 1 1 12.4 61.10 -4.2
# 2: 1 2 12.2 12.20 5.6
# 3: 1 24 45.2 23.00 98.0
# 4: 2 1 32.0 65.33 54.0
# 5: 2 2 1.2 5.70 101.9
# 6: 2 24 8.5 7.90 32.3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.